我在QMainWindow中有一個QTabWidget。在第一個tabWidget中,我有一個QLineEdit。爲什麼setFocus()不在這裏工作?
現在,如果我在第一個tabWidget的構造函數中調用QLineEdit的setFocus()
方法,當窗口出現時它不會被聚焦。
相反,如果我將相同的代碼放在tabWidget的showEvent()
中,它就可以工作。
這是爲什麼?
我在QMainWindow中有一個QTabWidget。在第一個tabWidget中,我有一個QLineEdit。爲什麼setFocus()不在這裏工作?
現在,如果我在第一個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();
方法(帶有表單上的標籤小部件),你會看到,所有的標籤都是在沒有父母的情況下創建的。在void QLayout::addChildWidget(QWidget *w)
馬託你可以看到這樣的代碼:
QWidget *mw = parentWidget();
QWidget *pw = w->parentWidget();
...
if (!pw && mw)
w->setParent(mw);
這意味着,沒有一個家長一個部件,將有佈局的父母,這是不是在我們的例子適當。
不幸的是,我不能回答兩個重要的問題:
可能是因爲在構造函數中還沒有有效的HWND。 – 2013-04-29 08:20:59