2013-04-29 226 views
0

我在QMainWindow中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit。为什么setFocus()不在这里工作?

现在,如果我在第一个tabWidget的构造函数中调用QLineEdit的setFocus()方法,当窗口出现时它不会被聚焦。

相反,如果我将相同的代码放在tabWidget的showEvent()中,它就可以工作。

这是为什么?

+2

可能是因为在构造函数中还没有有效的HWND。 – 2013-04-29 08:20:59

回答

2

通过挖掘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); 

这意味着,没有一个家长一个部件,将有布局的父母,这是不是在我们的例子适当。

不幸的是,我不能回答两个重要的问题:

  1. 为什么布局表现得那么奇怪,一个坏的父母添加窗口小部件时。
  2. 我们如何在适当的父项上添加制表符小部件上的制表符。