QT获取信号的发送者

1、兰布达表达式(Lambda)

for(int i = 0; i < 5; i++)
{
	QMessageBox *messageBox = new QMessageBox;
	messageBox ->setText(QString::number(i));
	messageBox ->setWindowModality(Qt::NonModal);
	messageBox ->show();
	qDebug() << "!!!!!!!!!!!!!! QMessageBox" << i << messageBox;
	connect(messageBox, &QMessageBox::buttonClicked,[=](){
		qDebug() << "!!!!!!!!!!!!!!QMessageBox connect " << messageBox->text() << messageBox ;
		messageBox->deleteLater() ;
	});
}

创建完QMessageBox后,各个QMessageBox的地址和编号
各个QMessageBox的地址和编号
点击编号为2的QMessageBox产生的信号打印的地址和编号
删除了编号为2的窗口
QT获取信号的发送者_第1张图片

2、QObject::sender

其实用QObject的sender也可以,代码如下

for(int i = 0; i < 5; i++)
{
	QMessageBox *messageBox = new QMessageBox;
	messageBox ->setText(QString::number(i));
	messageBox ->setWindowModality(Qt::NonModal);
	messageBox ->show();
	qDebug() << "!!!!!!!!!!!!!! QMessageBox" << i << messageBox;
	connect(messageBox , &QMessageBox::buttonClicked, this, &MainWindow::onMessageBox);
}
void MainWindow::onMessageBox()
{
	QMessageBox *p = qobject_cast(sender());
	qDebug() << "!!!!!!!!!!!!!!QMessageBox connect " << p->text() << p;
	p->deleteLater();
}

但sender不能用在兰布达表达式里,否则得到的是nullptr。

这论坛讨论方法也不错,有兴趣的可以去看下。

实际使用哪种方式看个人了,我习惯用兰布达表达式,因为方便编写。如有什么问题,欢迎评论探讨

你可能感兴趣的:(QT)