0

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

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

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

这是为什么?

4

1 回答 1

2

通过挖掘 Qt 的源代码,我发现这个问题并非特定于QTabWidget. 它发生,当QTabWidget::insertTab()被调用时,它调用QStackedWidget::insertWidget(),实际上是QStackedLayout::insertWidget(),它调用QLayout::addChildWidget()

所以我添加了一个简单QWidget的 MainWindow 表单并将这段代码添加到它的构造函数中:

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. 我们如何在具有适当父级的选项卡小部件上添加选项卡。
于 2013-05-02T11:12:34.050 回答