Qt - QObject::sender()函数的用法

QObject::sender()说明

  • QObject的sender()函数可以在槽函数中用来获取发射信号的对象,但是需要强制类型转换
  • 在槽函数里,使用 QObject::sender()可以获取信号发射者指针,如果知道信号发射者的类型,可以将指针投射为确定的类型,然后使用这个确认类的接口函数。

 

QObject::sender()用法

同时定义多个控件时,用sender区分当前使用的是哪个控件。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void btnAddClick();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
#include <QMessageBox>

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

    // 自定义两个按钮
    QPushButton *btnAdd = new QPushButton(this);
    btnAdd->setGeometry(QRect(0, 0, 100, 30));
    btnAdd->setText(QStringLiteral("Add Data "));

    QPushButton *btnDel = new QPushButton(this);
    btnDel->setGeometry(QRect(0, 100, 100, 30));
    btnDel->setText(QStringLiteral("Del Data "));

    connect(btnAdd, &QPushButton::clicked, this, &Widget::btnAddClick);
    connect(btnDel, &QPushButton::clicked, this, &Widget::btnAddClick);

    // 打印出按钮地址
    qDebug() << "Add Addr:"<< btnAdd << "Del Addr:" << btnDel;
}

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

void Widget::btnAddClick()
{
    // 获取是那个按钮点击了
    //写法1:
    //QPushButton *obj = qobject_cast<QPushButton *>(sender());
    //写法2:
    //QObject *obj = QObject::sender();
    //QPushButton *btn = qobject_cast<QPushButton*>(obj);
    //写法3:
    QPushButton *btn = static_cast<QPushButton*>(sender());

    // 打印出按钮地址
    qDebug() << btn;

    if (btn == nullptr)
    {
        // sender() 函数在槽函数之外调用是无效的,
        // 因此在这里执行错误处理操作。
        return;
    }
    // 进行其他的槽函数处理操作。
    QMessageBox::about(this, "tips", btn->text());
}

运行效果:

posted @ 2024-09-26 17:03  [BORUTO]  阅读(3)  评论(0编辑  收藏  举报