В настоящее время я работаю над хорошим способом использовать графический интерфейс для изменения содержимого объекта во время выполнения, проект использует Qt.
Поэтому я подумал о передаче QLayout объектам, чтобы они могли создавать свой собственный графический интерфейс. Как POC, я создал это («display» — это имя параметра QVBoxLayout *):
QPushButton* button = new QPushButton();
button->setText("foo");
button->setObjectName("bar");
display->addWidget(button);
который работает так же хорошо, как и ожидалось. Но мне нужно будет прочитать, что пользователь набрал в графическом интерфейсе, поэтому я сделал следующее:
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;
}
аналогично, список «виджетов» пуст.
Я попытался просмотреть полный список участников на http://doc.qt.digia.com/qt/qvboxlayout-members.html, но findChild / findChildren, кажется, лучше всего подходит для моих потребностей …
С наилучшими пожеланиями,
LDer
РЕШЕНИЕ НИЖЕ
Вот как я справляюсь сейчас:
вместо передачи QVBoxLayout при создании графического интерфейса, должен быть передан QWidget в следующем названии «display», как указано выше.
QVBoxLayout* layout = new QVBoxLayout();
display->setLayout(layout);
QPushButton* button = new QPushButton();
button->setText("foo");
button->setObjectName("bar");
layout->addWidget(button);
Теперь, чтобы найти ребенка / найти ребенка:
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;
}
у меня оба метода работают как положено! (Плюс, теперь макет можно свободно выбирать при создании графического интерфейса!)
Слава Славику81
Родитель 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
Других решений пока нет …