资料来源:
https://doc.qt.io/archives/qt-4.8/qsignalmapper.html
https://blog.csdn.net/mcgrady_tracy/article/details/6996947
在源码中存在大量的信号转发代码,也存在极少量信号转发器代码。从上述问题来看项目源码所出现问题单最终绝大部分可以归结于信号-槽问题。在QT编程中,如果遇到多个控件,但是他们的槽大致相同,这个该怎么处理,比如10个button,难道要写10个槽,可以不必这样,QSignalMapper可以帮组我们解决。
/* 按钮信号的转发 */
typedef enum
{
BUT_MENULOGO = 0U,
BUT_SOUNDLOGO,
BUT_FAULTSTATUS,
BUT_MAXCOUNT
} BUTNAME_E;
QList<QPushButton*> PushBtnList;
QMap<QPushButton*,BUTNAME_E> mapPushBut;
....
for (uint32_t i = (uint32_t)BUT_MENULOGO; i < (uint32_t)BUT_MAXCOUNT; i++)
{
PushBtnList << new QPushButton();
mapPushBut.insert(PushBtnList[i],static_cast<BUTNAME_E>(i));
}
...
QSignalMapper *SignalMapper = new QSignalMapper(this);
QStringList texts;
texts << "Menu" <<"Sound" << "FaultStatus"; /// 3个切换按钮
for (uint32_t i = (uint32_t)BUT_MENULOGO; i < (uint32_t)BUT_MAXCOUNT; i++)
{
connect(mapPushBut.value((BUTNAME_E)i),SIGNAL(clicked()),SignalMapper,SLOT(map()));
SignalMapper->setMapping (mapPushBut.value((BUTNAME_E)i), \
texts[i-(uint32_t)BUT_MENULOGO]);
}
// 将按下的按键名发送出去
connect(SignalMapper, SIGNAL(mapped(const QString &)), \
this, SLOT(clickExternalButtonHandler(const QString &)));
....
/// 槽函数
void clickExternalButtonHandler(const QString& str)
{
/// 匹配按键名
for(int i = 0;i < texts.size();i++)
{
if(texts.at(i).contains(str))
{
break;
}
}
}