如图所示,在treeWidget中,表格可以动态添加,而表格中的指令是一个QComboBox控件,我们不可能给每一个QComboBox添加一个槽函数,所以我们得把指令中所有QComboBox控件的信号统一发送,统一处理
代码如下:
signalMapper_ComboBox = new QSignalMapper(this);
//遍历测试流程中的子流程
for(int j=0; j<test_cmd_Array.size(); j++)
{
//根据测试指令列表中的指令,从cmd_list中查找对应的指令
int index = json_obj->find_cmd_list(cmd_list_Array, test_cmd_Array[j].toString());
if( index != -1 )
{
QJsonObject cmd_Obj = cmd_list_Array[index].toObject();
QTreeWidgetItem *child = new QTreeWidgetItem(root, QStringList() << cmd_Obj["需求信息"].toString());
//添加的每一个子项都是ComboBox
QComboBox *comb = new QComboBox(this); //新建一个ComboBox
comboBox_add_CmdList(comb, rootObj_backup); //将所有的指令放到ComboBox中
comb->setCurrentText(cmd_Obj["指令"].toString()); //根据指令显示当前的项
ui->treeWidget_EditFlow->setItemWidget(child,1,comb); //将ComboBox放到tree中
connect(comb, SIGNAL(currentIndexChanged(int)), signalMapper_ComboBox, SLOT(map()));
signalMapper_ComboBox->setMapping(comb, comb);
//connect(comb,SIGNAL(currentIndexChanged(int)),this,SLOT(slots_EditFlow_comb_changed(int)));
}
}
}
connect(signalMapper_ComboBox, SIGNAL(mapped(QWidget *)),this, SLOT(slots_EditFlow_comb_changed(QWidget *)));
上面的代码中,将添加的所有comb控件的currentIndexChanged信号转发到signalMapper_ComboBox转发器的map槽上,然后使用setMapping设置当mapped信号发送时发送QWidget类型的对象comb,最后设置mapped信号的槽函数slots_EditFlow_comb_changed。
void EditCmdWindow::slots_EditFlow_comb_changed(QWidget *widget)
{
//获得所有的指令
QJsonArray cmd_list_Array = rootObj_backup.value("cmd_list").toArray();
if( cmd_list_Array.isEmpty() == true )
{
return;
}
//将widget转为QComboBox
QComboBox *box = qobject_cast<QComboBox*>(widget);
qDebug() << "box = " << box->currentText();
}
在槽函数中将QWidget转为实际的控制类型,就可以得到是那一个控件改变了。
来源:CSDN
作者:玉石俱焚ing
链接:https://blog.csdn.net/sy84436446/article/details/104040226