5

我目前正在研究一种在运行时使用 GUI 修改对象内容的好方法,项目使用 Qt。

所以我想到了将 a 传递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 似乎最适合我的需求......

下面的解决方案

这就是我现在的处理方式:

与其将 a 传递QVBoxLayout给 GUI 创建,不如将 a 传递给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 创建自由选择布局!)

4

1 回答 1

5

a 的父级QWidget必须是 a 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
于 2012-11-22T19:30:59.530 回答