Доступ к виджетам, которые являются членами GridLayout

Я новичок в Qt Developer (почти месяц) и искал в сети решение моей проблемы, но ничего не нашел. Может быть, я не знал, как или что спросить об этом. Итак, я представлю проблему, которая преследует меня пару дней.

Я создаю форму динамически с помощью следующих команд:

QWidget *window = new QWidget;

QGridLayout *headerlayout = new QGridLayout;
QGridLayout *bodylayout = new QGridLayout;
QGridLayout *layout = new QGridLayout;

QLabel *countrylabel = new QLabel;
QComboBox *countrycombo = new QComboBox;
country << "" << "England" << "Germany" << "Greece" << "Italy" << "Netherlands";
countrycombo->addItems(country);
countrylabel->setText("Χώρα");
connect(countrycombo, SIGNAL(currentIndexChanged(int)), this, SLOT(countryselected(int)));

//Suppose there 8 more widgets here        

headerlayout->addWidget(countrylabel,0,0);
headerlayout->addWidget(countrycombo,0,1);

//Here is the body part

QLabel *label0 = new QLabel;
QLabel *label1 = new QLabel;

label0->setText("LABEL1");
label1->setText("<b>LABEL2</b>");

//suppose there are 10 labels here and 8 more of the commands below.
bodylayout->addWidget(label0,0,0);
bodylayout->addWidget(label1,0,1);

//HERE IS the CLEVER PART

for (int i=1;i<9;i++){

        QComboBox *combo1 = new QComboBox;
        QSpinBox *spin1 = new QSpinBox;
        QSpinBox *spin2 = new QSpinBox;
        QSpinBox *spin3 = new QSpinBox;

        bodylayout->addWidget(combo1,i,0);
        bodylayout->addWidget(spin1,i,1);
        bodylayout->addWidget(spin2,i,2);
        bodylayout->addWidget(spin3,i,3);
        }

//END OF CLEVER PART

//Bring them all together            
layout->addLayout(headerlayout,1,10,0);  
layout->addLayout(bodylayout,10,10,0);
window->setLayout(layout);

С помощью этого кода я создаю красивую динамическую форму, не о чем беспокоиться. Моя проблема описывается следующим вопросом:

-Как я могу получить доступ к виджетам в части CLEVER, чтобы изменить или прочитать их свойства (например, текущий индекс для полей со списком, значения для ящиков Spinbox и т.д.). То, что я хочу сделать, это сделать выбор для Countrycombo (вверху), затем изменить значения второго Combo в зависимости от первого значения Combo (не описано здесь, его в заголовке Layout) и после этого, изменить значения в поле со списком внутри части CLEVER и "прочитайте" значения из спин-боксов, чтобы сделать SQL "волшебным".

Я также читал о сигналах и слотах, но проблема стоит. Имя объекта или адрес в пределах CLEVER.

Я читал о создании QList, но не знаю, хорошая ли это идея.

Спасибо ник

1 ответ

Решение

Вы можете получить доступ к любому экземпляру QObject, используя следующий код:

QObject *object = parent->findChild<Class*>(objectName)

Поэтому все, что вам нужно сделать в своем коде, это определить имя объекта при создании ваших виджетов. Когда вы помещаете его в свой QGridLayout, он становится для них родительским, поэтому вы можете сделать что-то вроде этого:

countryCombo->setObjectName("Country");
...  
QComboBox *combo = headerLayout->findChild<QComboBox*>("Country");

Или вы можете использовать виджет, который принадлежит вашему макету - неважно.
Другой вариант, когда вы используете слоты, которые выполняются, когда виджет излучает сигнал. Если вы хотите получить доступ к отправителю виджета, вы можете использовать следующий код:

QComboBox *combo = qobject_cast<QComboBox*>(QObject::sender());
Другие вопросы по тегам