qt创建动态对象并为同一信号分配不同的功能
qt creating dynamic object and assigning a different function to the same signal
所以在我的程序中我动态生成了一些 QCheckBox
,数量取决于查询的结果,在每个 QCheckBox
旁边我想要一个 QLineEdit
仅在选中 QCheckBox
时显示
那我怎么才能link呢。
到目前为止,
我只有那样的东西,如果没有动态创建的所有指针的向量,我不知道该怎么做(比如 vector<vector<QObject*> > objets;
):
sondage_page2::sondage_page2(QWidget *parent) :
QWidget(parent),
ui(new Ui::sondage_page2)
{
// ...
if(query.exec())
{
if(query.size()>0)
{
while(query.next())
{
QCheckBox* check=new QCheckBox(query.value("Marque").toString());
ui->gridLayout->addWidget(check,row,0,Qt::AlignHCenter);
vector<QObject*> temp;
temp.push_back(check);
objets.push_back(temp);
QObject::connect(check,SIGNAL(stateChanged(int)),this,SLOT(checked(int)));
}
// ...
}
}
}
void sondage_page2::checked(int state)
{
// très broken
if(state==2) // checked
{
QLineEdit* edit=new QLineEdit();
objets.at(objets.size()-1).push_back(edit);
ui->gridLayout->addWidget(edit,row-1,1,Qt::AlignHCenter);
}
else
{
delete objets.at(row-1).at(1);
objets.at(row-1).pop_back();
}
}
编辑: 基本上,我希望在创建 QCheckBox 时在与我的 QCheckBox 相同的行上显示(或创建)一个 QLineEdit,并使用 QObject::connect 函数我只能 link objets 到相同的函数,我怎样才能让它工作?
以下不是交钥匙解决方案。它只是展示了一种可能的方法。很可能不是最好的解决方案。
你可以使用
QMap<QCheckBox*,QLineEdit*>
将您的 QCheckBox 与您的 QLineEdit 相关联。
在sondage_page2::sondage_page2中:
QCheckBox* check=new QCheckBox(query.value("Marque").toString());
...add to grid...
map[check] = nullptr;
connect(.....)
在sondage_page2::checked中:
QCheckBox *check = qobject_cast<QCheckBox *>(sender());
if(check){
if(state == 2){
QLineEdit* edit=new QLineEdit();
map[check] = edit;
...enter edit in gridlayout...
}else{
...remove from layout....
map[check].take()->deleteLater() // delete the QLineEdit;
edit->deleteLater();
}
}else{
// should not be possible... I think
}
这些片段应该完全按照您在上面概述的代码打算做的......据我所知。并非所有可能必要的完整性检查都已到位,例如支票真的在地图上吗?
所以在我的程序中我动态生成了一些 QCheckBox
,数量取决于查询的结果,在每个 QCheckBox
旁边我想要一个 QLineEdit
仅在选中 QCheckBox
时显示
那我怎么才能link呢。
到目前为止,
我只有那样的东西,如果没有动态创建的所有指针的向量,我不知道该怎么做(比如 vector<vector<QObject*> > objets;
):
sondage_page2::sondage_page2(QWidget *parent) :
QWidget(parent),
ui(new Ui::sondage_page2)
{
// ...
if(query.exec())
{
if(query.size()>0)
{
while(query.next())
{
QCheckBox* check=new QCheckBox(query.value("Marque").toString());
ui->gridLayout->addWidget(check,row,0,Qt::AlignHCenter);
vector<QObject*> temp;
temp.push_back(check);
objets.push_back(temp);
QObject::connect(check,SIGNAL(stateChanged(int)),this,SLOT(checked(int)));
}
// ...
}
}
}
void sondage_page2::checked(int state)
{
// très broken
if(state==2) // checked
{
QLineEdit* edit=new QLineEdit();
objets.at(objets.size()-1).push_back(edit);
ui->gridLayout->addWidget(edit,row-1,1,Qt::AlignHCenter);
}
else
{
delete objets.at(row-1).at(1);
objets.at(row-1).pop_back();
}
}
编辑: 基本上,我希望在创建 QCheckBox 时在与我的 QCheckBox 相同的行上显示(或创建)一个 QLineEdit,并使用 QObject::connect 函数我只能 link objets 到相同的函数,我怎样才能让它工作?
以下不是交钥匙解决方案。它只是展示了一种可能的方法。很可能不是最好的解决方案。
你可以使用
QMap<QCheckBox*,QLineEdit*>
将您的 QCheckBox 与您的 QLineEdit 相关联。
在sondage_page2::sondage_page2中:
QCheckBox* check=new QCheckBox(query.value("Marque").toString());
...add to grid...
map[check] = nullptr;
connect(.....)
在sondage_page2::checked中:
QCheckBox *check = qobject_cast<QCheckBox *>(sender());
if(check){
if(state == 2){
QLineEdit* edit=new QLineEdit();
map[check] = edit;
...enter edit in gridlayout...
}else{
...remove from layout....
map[check].take()->deleteLater() // delete the QLineEdit;
edit->deleteLater();
}
}else{
// should not be possible... I think
}
这些片段应该完全按照您在上面概述的代码打算做的......据我所知。并非所有可能必要的完整性检查都已到位,例如支票真的在地图上吗?