本文主要总结一种常用情况,当多个信号同时发送到一个槽函数时,需要在槽函数中判断,是哪个信号发射过来的。
解决这个问题,主要用到函数* QObject::sender()和QString sender()::objectName()。
QObject *sender() const;
QString objectName() const;
其中,函数* QObject::sender()是发送信号函数,函数QString sender()::objectName()是根据控件名称判断是哪个控件发送过来的。
比如我设定了两个按钮,然后分别设置两个按钮的objectName(可以用函数QPushButton::setObjectName(QString)),然后就可以根据这两个objectName,来判断是哪个按钮发送过来的信号。下面将通过一个实例来展示sender()函数用法。
1.1新建一个widget工程,不要勾选ui界面。然后分别在widget.h,widget.cpp,main.cpp分别添加如下代码。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
void createView();
private slots:
void On_ClickedButton();
private:
QVBoxLayout *mainLayout;
QPushButton *m_PushButton1;
QPushButton *m_PushButton2;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
createView();
}
void Widget::createView()
{
//初始化
mainLayout = new QVBoxLayout;
this->setLayout(mainLayout);
m_PushButton1 = new QPushButton("Button1");
m_PushButton2 = new QPushButton("Button2");
//设置控件唯一ID名称
m_PushButton1->setObjectName("Button1");
m_PushButton2->setObjectName("Button2");
//添加按钮
mainLayout->addWidget(m_PushButton1);
mainLayout->addWidget(m_PushButton2);
connect(m_PushButton1,SIGNAL(clicked(bool)),this,SLOT(On_ClickedButton()));
connect(m_PushButton2,SIGNAL(clicked(bool)),this,SLOT(On_ClickedButton()));
}
void Widget::On_ClickedButton()
{
QString m_ObjectName = sender()->objectName();
if(m_ObjectName.compare(QStringLiteral("Button1"))==0)
{
qDebug()<<m_ObjectName;
}
else if (m_ObjectName.compare(QStringLiteral("Button2"))==0)
{
qDebug()<<m_ObjectName;
}
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.resize(960,640);
w.show();
return a.exec();
}
1.2构建和运行后,结果如下图所示:
如上图所示,当点击button1,打印出Button1;当点击button2,打印出Button2。
参考内容:
https://blog.csdn.net/u013394556/article/details/39965667
https://blog.csdn.net/u014597198/article/details/52624672