2012-11-22 123 views
3

我目前正在研究一個很好的方式來使用GUI來修改運行時的對象內容,項目使用Qt。QT findChild返回0

所以我想到了將QLayout傳遞給對象,讓它們創建自己的GUI。作爲POC,我創建了這個(「顯示」是QVBoxLayout *參數的名稱):

QPushButton* button = new QPushButton(); 
button->setText("foo"); 
button->setObjectName("bar"); 
display->addWidget(button); 

它的工作原理與預期的一樣好。但我需要閱讀鍵入到GUI用戶什麼,所以這就是我所做的未來:

QPushButton *button2 = display->findChild<QPushButton *>(); 
if(button2) 
    std::cout << button2->objectName().toStdString() << std::endl; 

這裏沒有什麼是放出來 - if()語句是假的!

QList<QWidget *> widgets = display->findChildren<QWidget *>(); 
foreach (QWidget* b, widgets) { 
    std::cout << b->objectName().toStdString() << std::endl; 
} 

同樣,「小部件」列表爲空。

我試圖通過完整的成員名單在http://doc.qt.digia.com/qt/qvboxlayout-members.html看,但findChild/findChildren似乎是最適合我的需要...

最好的問候, lder連續

SOLUTION低於

這就是我現在如何處理它:

而不是通過一個QVBo xLayout創建GUI時,應該傳遞一個QWidget,並按照上面的名稱「display」顯示。

QVBoxLayout* layout = new QVBoxLayout(); 
display->setLayout(layout); 

QPushButton* button = new QPushButton(); 
button->setText("foo"); 
button->setObjectName("bar"); 

layout->addWidget(button); 
現在

到findChild/findChildren:

QPushButton *button2 = display->findChild<QPushButton *>("bar"); 
if(button2) 
    std::cout << button2->objectName().toStdString() << std::endl; 

QList<QWidget *> widgets = display->findChildren<QWidget *>(); 
foreach (QWidget* b, widgets) { 
    std::cout << b->objectName().toStdString() << std::endl; 
} 

這兩種方法對我的工作如預期! (另外,現在的佈局可以自由通過GUI創建選擇!)

榮譽給Slavik81

回答

4

一個QWidget的母公司必須是QWidgetQLayout不是QWidget

佈局存在移動和調整QWidget的孩子的大小。儘管您可以通過在佈局上進行調用來添加子窗口小部件,但最終,他們的父窗口將是佈局所在的QWidget

爲了說明:

QWidget* widget = new QWidget; 
qDebug("Widget: %p", widget); 

QHBoxLayout* layout = new QHBoxLayout; 
qDebug("Layout: %p", layout); 

QWidget* child = new QWidget; 
layout->addWidget(child); 

qDebug("Child's parent before setLayout: %p", child->parent()); 
widget->setLayout(layout); 
qDebug("Child's parent after setLayout: %p", child->parent()); 

輸出:

Widget: 0x8e1c1e0 
Layout: 0x8e1c3f0 
Child's parent before setLayout: 0x0 
Child's parent after setLayout: 0x8e1c1e0