本文主要總結一種常用情況,當多個信号同時發送到一個槽函數時,需要在槽函數中判斷,是哪個信号發射過來的。
解決這個問題,主要用到函數* 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