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

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());

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QObject::connect函数可以用来建立对象之间的信号和槽的连接,可以使一个对象的信号触发另一个对象的槽函数。它的用法是:QObject::connect(sender, signal, receiver, slot)。 ### 回答2: QObject::connect函数是Qt中用于建立信号与槽连接的函数,它的语法如下: QObject::connect(sender, signal, receiver, slot, connectionType); 其中,sender是发送信号的对象,signal是发出的信号,receiver是接收信号的对象,slot是处理信号的槽函数。connectionType是一个可选参数,用于指定连接的类型,默认为Qt::AutoConnection。 使用QObject::connect函数,首先需要确定信号和槽函数的声明,然后可以在程序的任意位置调用该函数进行连接。例如,假设有一个按钮对象button和一个槽函数slotFunction,可以使用以下代码连接信号与槽: QObject::connect(button, SIGNAL(clicked()), this, SLOT(slotFunction())); 在这个例子中,当按钮被点击时,会触发一个clicked信号,然后会调用槽函数slotFunction来处理该信号。 连接时还可以使用lambda表达式来代替槽函数,例如: QObject::connect(button, &QPushButton::clicked, [](){ qDebug() << "Button clicked"; }); 这里使用了C++11的lambda表达式作为槽函数,当按钮被点击时,会输出一条调试信息。 需要注意的是,QObject::connect函数只能连接QObject或其子类的实例之间的信号与槽,且槽函数必须是可调用的(可以是普通函数、成员函数、静态函数等)。 总结而言,QObject::connect函数是Qt中用于建立信号与槽连接的重要函数,它的使用需要理解信号与槽的声明,并进行正确的参数传递。 ### 回答3: QObject::connect函数用于建立信号和槽之间的连接,使得当信号触发时,槽函数会被自动调用。 函数的基本语法如下: connect(sender, signal, receiver, slot, Qt::ConnectionType); 其中,sender是发送信号的对象,signal是发送的信号,receiver是接收信号的对象,slot是接收信号调用的槽函数。 例子: 我们有一个名为button的QPushButton对象,我们想在用户点击按钮时触发一个名为myFunction的槽函数。 首先,我们需要在Qt头文件中声明和定义槽函数myFunction。 然后,在我们的代码中,我们可以连接按钮的clicked信号和myFunction槽函数,如下所示: QObject::connect(button, &QPushButton::clicked, this, &MyClass::myFunction); 在这个例子中,button是发送clicked信号的对象,&QPushButton::clicked表示clicked信号,this是接收信号的对象,&MyClass::myFunction表示myFunction槽函数。 最后一个参数Qt::ConnectionType是可选的,默认为Qt::AutoConnection,会根据发送和接收对象的线程自动选择信号的连接方式。你可以根据需要使用其他连接方式。 总结起来,QObject::connect函数简单地描述了信号和槽之间的连接关系,使得当信号发出时,槽函数会被自动调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值