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