私は現在、実行時に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の作成によってレイアウトを自由に選択できるようになりました!)