前言
在一个比较大型的项目当中,免不了大量的信号与槽的使用,因此这里就引发了一个思考如何去管理这些大量相似的关系呢?比如存在1000个按钮都需要绑定按钮点击触发到一个槽函数,肯定这1000个按钮对应的槽函数业务逻辑都会不一样,我们是一个一个的绑定吗?显然这样做会耗费大量的时间写类似的代码
正文
方法一 : 每个按钮关联到一个独立的槽,虽然是可以这样做的,但是这样以来,会写多少的代码,代码量大不可取放弃
方法二: 所有信号发送者即按钮都绑定到同一个槽函数,在槽函数中使用sender()进行区分
connect(btn, SIGNAL(clicked(bool)), this, SLOT(doBtn()));
void Widget::doBtn()
{
QPushButton *btn = (QPushButton *)sender();
QString name = btn->objectName();
qDebug() << TIMEMS << "doBtn1" << name;
}
方法二:使用信号转发类
QSignalMapper *signMap = new QSignalMapper(this);
connect(signMap, SIGNAL(mapped(QString)), this, SLOT(doBtn(QString)));
for (int i = 0; i < 1000; ++i) {
{
QPushButton *btn = new QPushButton(this);
btn->setObjectName(QString("btn_%1").arg(i + 1));
btn->setText(QString("text_%1").arg(i + 1));
connect(btn, SIGNAL(clicked(bool)), signMap, SLOT(map()));
signMap->setMapping(btn, btn->objectName());
}
void Widget::doBtn(const QString &name)
{
qDebug() << TIMEMS << "doBtn2" << name;
}
方法四: 用 lambda 表达式
connect(btn, &QPushButton::clicked, [btn] {
QString name = btn->objectName();
qDebug() << TIMEMS << "doBtn3" << name;
});
//或
connect(btn, &QPushButton::clicked, [=]() {
QString name = btn->objectName();
qDebug() << TIMEMS << "doBtn3" << name;
});
结果:
不考录方法一,其他几种方式效率是差不多的,从结果上看方法二只是快了1ms而已