我在QMainWindow中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit。
现在,如果我在第一个tabWidget的构造函数中调用QLineEdit的setFocus()
方法,那么当窗口出现时它就不会聚焦。
相反,如果我将相同的代码放在tabWidget的showEvent()
中,它就会起作用。
为什么?
答案 0 :(得分:2)
通过Qt的源代码挖掘,我发现这个问题不是QTabWidget
特有的。调用QTabWidget::insertTab()
时,会调用QStackedWidget::insertWidget()
,实际上是QStackedLayout::insertWidget()
,调用QLayout::addChildWidget()
。
所以我在MainWindow表单中添加了一个简单的QWidget
,并将此代码添加到它的构造函数中:
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)
mathod中,您可以看到以下代码:
QWidget *mw = parentWidget();
QWidget *pw = w->parentWidget();
...
if (!pw && mw)
w->setParent(mw);
这意味着,没有父级的窗口小部件将具有布局的父级,这在我们的情况下是不合适的。
不幸的是,我无法回答两个重要问题: