概述
QObject::sender()
当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,所以在对应的slot里就可以通过 sender()得到当前是那个对象调用了slot。
如果在由信号激活的插槽中调用该函数,返回指向发送信号的对象的指针,否则返回0,该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。
应用场景1
在Qt开发过程中遇到了一个槽函数对应多个信号发送者,需要区分是哪一个sender,然后做不同的处理。
例如:界面上有3个按钮,都绑定同一个槽函数,点击之后弹出各自的按钮名字,界面如下:
在槽函数中返回按钮的对象指针,从而可以操作该按钮,调用它的一些方法,属性等。
#include "test_sender.h"
#include <QMessageBox>
test_sender::test_sender(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.btn1, &QPushButton::clicked, this, &test_sender::onFunc);
connect(ui.btn2, &QPushButton::clicked, this, &test_sender::onFunc);
connect(ui.btn3, &QPushButton::clicked, this, &test_sender::onFunc);
}
void test_sender::onFunc()
{
QPushButton *pBtn = (QPushButton*)sender();
QMessageBox::about(this, "tips", pBtn->text());
}
应用场景2
在TCP通讯时多个客户端同时发送给服务端,需要判断到底是哪个客户端emit了这个sgnal,根据sender的不同来进行不同的处理.
QObject::Sender()返回发送信号的对象的指针,返回类型为QObject *
void CardTCPServer::readyRead()
{
QTcpSocket *client = (QTcpSocket *)this->sender();
client->peerAddress();
QString str1 = QString("client[%1:%2]").arg(client->peerAddress().toString())
.arg(client->peerPort());
QString strNetData;
while (!client->atEnd())//没有读到末尾一直读
{
strNetData.append(QString(client->readAll()));
}
qDebug() << "recv:" << strNetData;
}
格式写法
QPushButton*editor = qobject_cast<QPushButton*>(sender());
QPushButton*editor = static_cast<QPushButton*>(sender());
// 获取对象名
QString str = static_cast<QString>(this->sender()->objectName());
注意事项
1、使用sender()方法获取信号的发送对象,前提是槽函数是被信号触发的,而非自己调用,否则返回空(nullptr),所以我们在使用的时候最好加个非空判断;
2、通过此方法获取的对象指针仅在槽函数执行的期间有效;
3、如果在此期间,信号发送对象被销毁,或者信号与槽函数已经断开,此对象指针将无效;
4、定义了一个自己的类(不是Qt基类),由于sender类类型转换时需要的是Qt基类,而不是自定义的类。修改类型转时代码为Qt基类即可。
class myClass: public QWidget
QWidget *test1 = qobject_cast<QWidget*>(sender());
最后
以上就是称心航空为你收集整理的Qt---QObject::sender()的用法的全部内容,希望文章能够帮你解决Qt---QObject::sender()的用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复