Qt 访问作为GridLayout成员的小部件

Qt 访问作为GridLayout成员的小部件,qt,qgridlayout,Qt,Qgridlayout,我是一个新的Qt开发者(差不多一个月),我在网上搜索了一个关于我的问题的解决方案,但什么也没找到。也许,我不知道该怎么问,也不知道该问什么。 因此,我将提出困扰我几天的问题 我使用以下命令动态创建表单: QWidget *window = new QWidget; QGridLayout *headerlayout = new QGridLayout; QGridLayout *bodylayout = new QGridLayout; QGridLayout *layout = new QG

我是一个新的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);
QWidget*window=新的QWidget;
QGridLayout*headerlayout=新的QGridLayout;
QGridLayout*bodylayout=新的QGridLayout;
QGridLayout*layout=新的QGridLayout;
QLabel*countrylabel=新的QLabel;
QCOMBOX*countrycombo=新的QCOMBOX;
国家/地区设置文本(“标签2”);
//假设这里有10个标签,下面还有8个命令。
bodylayout->addWidget(label0,0,0);
bodylayout->addWidget(标签1,0,1);
//这是聪明的部分
for(inti=1;iaddWidget(combo1,i,0);
bodylayout->addWidget(spin1,i,1);
bodylayout->addWidget(spin2,i,2);
bodylayout->addWidget(spin3,i,3);
}
//聪明部分的结尾
//把他们都带到一起
布局->添加布局(标题布局,1,10,0);
布局->添加布局(车身布局,10,10,0);
窗口->设置布局(布局);
通过这段代码,我创建了一个漂亮的动态表单,无需担心。 以下问题描述了我的问题:

-如何访问Smart部分中的小部件以更改或读取其属性(例如组合框的当前索引、旋转框的值等)。 我想做的是选择countrycombo(在顶部),然后根据第一个combo值更改第二个combo的值(这里没有描述,它在headerlayout中),然后更改Smart部分中combo框的值,并从Spinbox中“读取”值,以使SQL变得“神奇”

我也读过关于信号和插槽的文章,但问题依然存在。智能部分中的objectname或address

我读过关于创建QList的文章,但我不知道这是否是个好主意

谢谢
Nik

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

QObject *object = parent->findChild<Class*>(objectName)
QComboBox *combo = qobject_cast<QComboBox*>(QObject::sender());
QObject*object=parent->findChild(objectName)
因此,在代码中,您所要做的就是在创建小部件时定义一个对象名。当您将其放置到QGridLayout时,它将成为它们的父对象,因此您可以执行以下操作:

countryCombo->setObjectName("Country");
...  
QComboBox *combo = headerLayout->findChild<QComboBox*>("Country");
countryCombo->setObjectName(“国家”);
...  
QComboBox*combo=headerLayout->findChild(“国家”);
或者,您可以使用自己的布局小部件-无所谓。
另一个选项是当您使用插槽时,当小部件发出信号时执行插槽。如果您想访问小部件发送器,可以使用以下代码:

QObject *object = parent->findChild<Class*>(objectName)
QComboBox *combo = qobject_cast<QComboBox*>(QObject::sender());
QComboBox*combo=qobject\u cast(qobject::sender());

这就像给对象取了另一个名字来访问它。我尝试了第一个选项,现在我可以访问我的类中的子类。谢谢