Qt findChild возвращает 0

В настоящее время я работаю над хорошим способом использовать графический интерфейс для изменения содержимого объекта во время выполнения, проект использует 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

3

Решение

Родитель 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
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector