QSignalMapper转发器的应用

你。 提交于 2020-01-19 15:12:55

如图所示,在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转为实际的控制类型,就可以得到是那一个控件改变了。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!