Qt4 为什么';你在这里工作吗?

Qt4 为什么';你在这里工作吗?,qt4,focus,Qt4,Focus,我在qmain窗口中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit 现在,如果我在第一个tabWidget的构造函数中调用QLineEdit的setFocus()方法,当窗口出现时,它就不会被聚焦 相反,如果我在tabWidget的showEvent()中放入相同的代码,它就会工作 为什么会这样?通过深入研究Qt的源代码,我发现这个问题并不是特定于QTabWidget。当调用QTabWidget::insertTab()时,它会调用QStackedWidge

我在qmain窗口中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit

现在,如果我在第一个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()方法(表单上有tab小部件),您将看到,所有选项卡都是在没有父项的情况下创建的。在
void QLayout::addChildWidget(QWidget*w)
mathod中,您可以看到以下代码:

QWidget *mw = parentWidget();
QWidget *pw = w->parentWidget();

...

if (!pw && mw)
    w->setParent(mw);
这意味着,没有父控件的小部件将具有布局的父控件,这在我们的示例中是不合适的

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

  • 为什么在添加具有坏父级的小部件时,布局行为会如此奇怪
  • 如何添加具有适当父级的tab-on-tab小部件

  • 可能是因为构造函数中还没有有效的HWND。