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
}

这些片段应该完全按照您在上面概述的代码打算做的......据我所知。并非所有可能必要的完整性检查都已到位,例如支票真的在地图上吗?