我在 QMainWindow 中有一个 QTabWidget。在第一个 tabWidget 中,我有一个 QLineEdit。
现在,如果我setFocus()
在第一个 tabWidget 的构造函数中调用 QLineEdit 的方法,当窗口出现时它不会获得焦点。
相反,如果我将相同的代码放在showEvent()
tabWidget 中,它就可以工作。
这是为什么?
通过挖掘 Qt 的源代码,我发现这个问题并非特定于QTabWidget
. 它发生,当QTabWidget::insertTab()
被调用时,它调用QStackedWidget::insertWidget()
,实际上是QStackedLayout::insertWidget()
,它调用QLayout::addChildWidget()
。
所以我添加了一个简单QWidget
的 MainWindow 表单并将这段代码添加到它的构造函数中:
widget->setLayout(new QHBoxLayout);
widget->layout()->addWidget(new TestWidget(this));
它也很糟糕。
然后我注意到,以下代码工作正常:
widget->setLayout(new QHBoxLayout);
widget->layout()->addWidget(new TestWidget(widget));
这两段代码之间的唯一区别是 wiget 的父级。
如果您查看setupUi();
方法(在表单上有选项卡小部件),您会看到所有选项卡都是在没有父项的情况下创建的。在void QLayout::addChildWidget(QWidget *w)
数学中,您可以看到以下代码:
QWidget *mw = parentWidget();
QWidget *pw = w->parentWidget();
...
if (!pw && mw)
w->setParent(mw);
这意味着,没有父级的小部件将具有布局的父级,这在我们的例子中是不合适的。
不幸的是,我无法回答两个重要问题: