Qt findChild返回0

时间:2012-11-22 19:09:04

标签: c++ qt user-interface

我目前正在努力使用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创建自由选择布局!)

1 个答案:

答案 0 :(得分: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