Qt 之 重复连接信号槽

概述

在使用Qt做项目时,一个槽函数通常不会只被一个对象的一个信号所绑定。有时候我们可能需要将多个不同对象的信号绑定到同一个槽函数上,然后通过sender()找到信号的发送者并做相关处理。有趣的是,重复绑定同一个对象的同一个信号到同一个槽函数上,槽函数的调用次数正好是信号的绑定次数。

示例代码

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
头文件中的on_pushButton_clicked()槽函数是通过UI文件中的“转到槽”功能自动生成的,这意味着pushButton按钮已经绑定一次信号槽了。

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
    connect(ui->pushButton1,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
    connect(ui->pushButton1,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    qDebug()<<"sender is:"<<sender()<<endl;

    static int pushButtonClickTimes(0);
    static int pushButton1ClickTimes(0);
    QString senderName = sender()->objectName();
    QString pushButtonText("");
    QString pushButton1Text("");

    if("pushButton" == senderName) {
        pushButtonText = QString("cick %1").arg(++pushButtonClickTimes);
        ui->pushButton->text().clear();
        ui->pushButton->setText(pushButtonText);
    } else if("pushButton1" == senderName) {
        pushButton1Text = QString("cick %1").arg(++pushButton1ClickTimes);
        ui->pushButton1->text().clear();
        ui->pushButton1->setText(pushButton1Text);
    }

}
构造函数中pushButton信号槽关联了两次加上在UI文件中自动转到槽函数一共三次,pushButton1关联了两次。两个按钮都是关联到同一个槽函数on_pushButton_clicked()。槽函数中定义两个静态整形变量分别统计两个按钮触发槽函数的次数,sender()获得发射信号的对象指针,通过该对象指针的objectName()方法可以得到对象的名字。分别在不同的判断条件中自增对象按钮的计数变量并显示提示文本在对应的按钮上。

mainwindow.ui



运行结果


可见Qt的元对象系统,在处理同一信号关联同一槽函数(信号的发射对象和槽函数的接收对象都一致)是和处理不同对象关联同一槽函数一样的。关联几次信号槽,发射信号后就会调用几次槽函数,而不是只调用一次。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值