我目前正在努力使用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()语句为false!
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);
现在转到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创建自由选择布局!)
答案 0 :(得分:4)
QWidget
的父级必须是QWidget
。 QLayout
不是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