【问题标题】:Why doesn't setFocus() work here?为什么 setFocus() 在这里不起作用?
【发布时间】:2013-04-29 08:18:48
【问题描述】:

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

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

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

这是为什么呢?

【问题讨论】:

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

标签: qt4 focus


【解决方案1】:

翻阅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. 我们如何在选项卡小部件上添加具有适当父级的选项卡。

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2019-02-10
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多