5

私は現在、実行時に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が私のニーズに最も適しているようです...

以下の解決策

これが私が今それを処理する方法です:

上記のように「display」という名前の次のようQVBoxLayoutに、GUIの作成にaを渡す代わりに、aを渡す必要があります。QWidget

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

の親はである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
于 2012-11-22T19:30:59.530 に答える