我目前正在研究一個很好的方式來使用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