2013-04-29 216 views
0

我在QMainWindow中有一個QTabWidget。在第一個tabWidget中,我有一個QLineEdit。爲什麼setFocus()不在這裏工作?

現在,如果我在第一個tabWidget的構造函數中調用QLineEdit的setFocus()方法,當窗口出現時它不會被聚焦。

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

這是爲什麼?

+2

可能是因爲在構造函數中還沒有有效的HWND。 – 2013-04-29 08:20:59

回答

2

通過挖掘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); 

這意味着,沒有一個家長一個部件,將有佈局的父母,這是不是在我們的例子適當。

不幸的是,我不能回答兩個重要的問題:

  1. 爲什麼佈局表現得那麼奇怪,一個壞的父母添加窗口小部件時。
  2. 我們如何在適當的父項上添加製表符小部件上的製表符。