天天看點

Qt5.9中一個槽函數接收多個信号用法(函數sender())

本文主要總結一種常用情況,當多個信号同時發送到一個槽函數時,需要在槽函數中判斷,是哪個信号發射過來的。

解決這個問題,主要用到函數* 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建構和運作後,結果如下圖所示:

Qt5.9中一個槽函數接收多個信号用法(函數sender())
Qt5.9中一個槽函數接收多個信号用法(函數sender())

如上圖所示,當點選button1,列印出Button1;當點選button2,列印出Button2。

參考内容:

https://blog.csdn.net/u013394556/article/details/39965667

https://blog.csdn.net/u014597198/article/details/52624672

繼續閱讀