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构建和运行后,结果如下图所示:




如上图所示,当点击button1,打印出Button1;当点击button2,打印出Button2。


参考内容:

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

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

猜你喜欢

转载自blog.csdn.net/naibozhuan3744/article/details/80858316
今日推荐