为什么setFocus()不在这里工作?

时间:2013-04-29 08:18:49

标签: qt4 focus

我在QMainWindow中有一个QTabWidget。在第一个tabWidget中,我有一个QLineEdit。

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

相反,如果我将相同的代码放在tabWidget的showEvent()中,它就会起作用。

为什么?

1 个答案:

答案 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);

这意味着,没有父级的窗口小部件将具有布局的父级,这在我们的情况下是不合适的。

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

  1. 为什么在使用错误的父级添加小部件时布局会如此奇怪。
  2. 我们如何使用适当的父级在标签小部件上添加标签。