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