1、接着上一讲的软件项目,修改方法void Form2::addCellWidget(int row)的代码如下:
void Form2::addCellWidget(int row) { QComboBox* myCobBox = new QComboBox(); myCobBox->setObjectName(QString::number(row)); connect(myCobBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(comboBoxSlot(QString))); myCobBox->addItem(""); myCobBox->addItem("first"); myCobBox->addItem("two"); myCobBox->addItem("three"); ui->tableWidget->setCellWidget(row,3,myCobBox); QCheckBox *myCheckBox = new QcheckBox(); myCheckBox->setObjectName(QString::number(row)); connect(myCheckBox,SIGNAL(stateChanged(int)),this,SLOT(checkboxSlot(int))); ui->tableWidget->setCellWidget(row,4,myCheckBox); }
在该方法中, QComboBox是我们动态生成的,不能在Form2.ui界面设计中直接右键→“go to slot”选择一个信号自动生成鼠标响应槽函数,我们可以用connect(myCobBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(comboBoxSlot(QString)));自定义一个槽函数 comboBoxSlot,至于 SIGNAL有哪些,可以光标选中 QComboBox,按下F1按键,打开帮助文档,查看QComboBox有哪些信号,这里我们用了currentIndexChanged(QString)信号, QCheckBox的槽函数同样的方法定义了 checkboxSlot;
2、 comboBoxSlot槽函数完成QComboBox的鼠标响应,并把下拉框选择结果赋给表格 tableWidget的这个单元中,代码如下:
void Form2::comboBoxSlot(QString text) { QComboBox *comb = qobject_cast<QComboBox*>(sender()); int row = comb->objectName().toInt(); ui->tableWidget->item(row,3)->setText(text); }
这里要注意的是,如何知道是哪一行的 QComboBox被鼠标点击了呢?我们通过QComboBox *comb = qobject_cast<QComboBox*>(sender());可以得到鼠标点击后发送信号的QComboBox是哪一个,同时,在我们动态创建这个QComboBox,已经把它属于哪一行的信息通过代码myCobBox->setObjectName(QString::number(row))赋给了这个对象的名称,所以这个QComboBox的行号就得到了;
3、 checkboxSlot槽函数完成 QCheckBox的鼠标响应,当表格的该行被选中时,该行数据保存到一个链表中,代码如下:
void Form2::checkboxSlot(int state) { QCheckBox *check = qobject_cast<QCheckBox*>(sender()); int row = check->objectName().toInt(); if(state==2) { mDa = ui->tableWidget->item(row,0)->text().toInt(); mDa = ui->tableWidget->item(row,1)->text().toInt(); mDa = ui->tableWidget->item(row,2)->text(); mDa = ui->tableWidget->item(row,3)->text();; mDa = state; mda(mData); } }
定位是哪行的 QCheckBox响应了鼠标点击与步骤2同理;
实例过程和效果如视频所示: