访问作为GridLayout成员的小部件

时间:2015-01-22 13:54:23

标签: qt qgridlayout

我是一名新手Qt开发人员(差不多一个月),我在网上搜索我的问题的解决方案,但我一无所获。也许,我不知道该怎么回事。 所以,我将提出几天困扰我的问题。

我使用以下命令动态创建表单:

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部分中的小部件以更改或读取其属性(例如,组合框的当前索引,Spinboxes的值等)。 我想要做的是选择countrycombo(在顶部),然后根据第一个组合值(此处未描述,它在headerlayout中)更改第二个组合的值,然后更改值在CLEVER部分的组合框中,&#34;阅读&#34;来自spinboxes的值,以便制作一些SQL&#34; magic&#34;。

我还阅读了有关SIGNAL和SLOT的内容,但问题仍然存在。 CLEVER部分中的对象名或地址。

我读过有关创建QList的内容,但我不知道这是不是一个好主意。

由于 NIK

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码访问任何QObject实例:

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

因此,您在代码中所要做的就是在创建窗口小部件时定义对象名称。当你把它放到你的QGridLayout时它会成为他们的父母,所以你可以这样做:

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

或者您可以使用拥有您布局的小部件 - 无论如何 另一个选项是当您使用插槽时,小部件发出信号时执行。如果要访问小部件发件人,可以使用以下代码:

QComboBox *combo = qobject_cast<QComboBox*>(QObject::sender());