我目前正在研究一种使用 GUI 在运行时修改对象内容的好方法,项目使用 Qt。
所以我想到了通过QLayout
到对象,让他们创建自己的 GUI。作为 POC,我创建了这个(“display”是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;
}
同样,widgets
列表为空。
我尝试查看完整的成员列表:http://doc.qt.digia.com/qt/qvboxlayout-members.html,但 findChild/findChildren 似乎最适合我的需求......
解决方案如下
我现在是这样处理的:
而不是通过QVBoxLayout
对于 GUI 创建,QWidget
应在下面名为“display”的名称中传递,如上所述。
QVBoxLayout* layout = new QVBoxLayout();
display->setLayout(layout);
QPushButton* button = new QPushButton();
button->setText("foo");
button->setObjectName("bar");
layout->addWidget(button);
now to 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 创建自由选择布局!)