qobject_cast(QObject::sender()) 使用

1.qobject_cast

最近在看一份开源项目时看到有qobject_cast的用法,经查阅学习后,记录文档
部分资料来自 安全的转换方式——qobject_cast

2.用法

函数原型:

T qobject_cast ( QObject * object )

本方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0。

在使用时有两个限制:

1、T类型必须继承自QObject。

2、在声明时必须有Q_OBJECT宏。

3.QObject::sender()

官方手册说明:
在这里插入图片描述
翻译:
返回指向发送信号的对象的指针,如果在由信号激活的插槽中调用该指针;否则返回nullptr。该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。
如果发送方被销毁,或者插槽与发送方的信号断开,则此函数返回的指针将无效。
警告:此函数违反了面向对象的模块化原则。但是,当许多信号连接到一个插槽时,访问发送方可能很有用。
警告:如上所述,当槽通过Qt::DirectConnection从不同于此对象的线程调用时,此函数的返回值无效。不要在这种情况下使用这个函数。

也就是说返回的就是发送信号对象的指针,不存在则返回nullptr.注意信号应该和槽在同一线程

4.代码测试

#include <QCoreApplication>
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QDebug>
#include <QTextEdit>

class MyWin: public QMainWindow
{
public:
    explicit MyWin(QWidget* parent = nullptr)
        :QMainWindow(parent)
    {
       resize(600,300);
       QTextEdit *edit = new QTextEdit(this);
       edit->move(0,0);
       edit->resize(100,100);
       edit->append("test1");

       QLineEdit* text = new QLineEdit(this);
       text->move(100,100);
       text->resize(100,40);
       text->setText("test22");

       connect(edit,&QTextEdit::textChanged,this,&MyWin::onSender);
       connect(text,&QLineEdit::textChanged,this,&MyWin::onSender);
    }

private:
    void onSender()
    {
        QTextEdit* text = qobject_cast<QTextEdit*>(QObject::sender());
        if(text)
        {
            qDebug() << "this is test button:" << text->toPlainText();
        }
        QLineEdit *line = qobject_cast<QLineEdit*>(QObject::sender());
        if(line)
        {
            qDebug() << "this is test lineEdie:" << line->text();
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWin w;
    w.show();
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值