我在QMainWindow中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit。为什么setFocus()不在这里工作?
现在,如果我在第一个tabWidget的构造函数中调用QLineEdit的setFocus()
方法,当窗口出现时它不会被聚焦。
相反,如果我将相同的代码放在tabWidget的showEvent()
中,它就可以工作。
这是为什么?
我在QMainWindow中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit。为什么setFocus()不在这里工作?
现在,如果我在第一个tabWidget的构造函数中调用QLineEdit的setFocus()
方法,当窗口出现时它不会被聚焦。
相反,如果我将相同的代码放在tabWidget的showEvent()
中,它就可以工作。
这是为什么?
通过挖掘Qt的源代码,我发现,这个问题并不是特定于QTabWidget
。它发生时,调用QTabWidget::insertTab()
时,调用QStackedWidget::insertWidget()
,这实际上是QStackedLayout::insertWidget()
,它调用QLayout::addChildWidget()
。
所以我添加了一个简单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)
马托你可以看到这样的代码:
QWidget *mw = parentWidget();
QWidget *pw = w->parentWidget();
...
if (!pw && mw)
w->setParent(mw);
这意味着,没有一个家长一个部件,将有布局的父母,这是不是在我们的例子适当。
不幸的是,我不能回答两个重要的问题:
可能是因为在构造函数中还没有有效的HWND。 – 2013-04-29 08:20:59