LabelPrivate d = static_cast<LabelPrivate>(d_ptr); // cast to our private type d->text = text; } 可以定义这样的宏来使代码变得简洁。 #define DPTR(Class) Class##Private d = static_cast<Class##Private>(d_ptr) #define QPTR(Class) Class q = static_cast<Class>(q_ptr) void LabelPri...
到这里就解析清楚了Qt中d_ptr和q_ptr的作用。 #defineDPTR(Class) Class##Private d = static_cast<Class##Private>(d_ptr)#defineQPTR(Class) Class q = static_cast<Class>(q_ptr)voidLabelPrivate::someHelperFunction(){QPTR(label); q->selectAll();// we can call functions in Label now}void...
1. Qt 中的一个类常用一个PrivateXXX类来处理内部逻辑,使得内部逻辑与外部接口分开,这个PrivateXXX对象通过D指针来访问;在PrivateXXX中有需要引用Owner的内容,通过Q指针来访问。 2. 由于D和Q指针是从基类继承下来的,子类中由于继承导致类型发生变化,需要通过static_cast类型转化,所以DPTR() 与QPTR()宏定义实现了转...
#include"q_ptr.h" MyClass::MyClass(QObject *parent) : QObject(parent), d_ptr(new MyClassPrivate(this)) {} MyClass::~MyClass() { DPTR(MyClass); delete d; } void MyClass::testFunc() { DPTR(MyClass); d->fool(); } //q_ptr.h #ifndef Q_PTR_H #define Q_PTR_H #include<...
DPTR(Label); d->text = text; } void LabelPrivate::someHelperFunction() { QPTR(label); q->selectAll();// 我们现在可以通过此函数来访问所有Label类中的方法 } 至于,Qt中的D指针和Q指针的具体形式以及相应的宏定义,这里就不再重复,Xizhi Zhu的文章中已经有写,完整的d指针和q指针的程序实例程序如下...
Qt中的一个类常用一个PrivateXXX类来处理内部逻辑,使得内部逻辑与外部接口分开,这个PrivateXXX对象通过D指针来访问;在PrivateXXX中有需要引用Owner的内容,通过Q指针来访问。 由于D和Q指针是从基类继承下来的,子类中由于继承导致类型发生变化,需要通过static_cast类型转化,所以DPTR()与QPTR()宏定义实现了转换。 题目 ...
template <typename T> class QList; class QLocale; #if defined(Q_WS_QWS) class QDecoration; #endif class QApplication; class QApplicationPrivate; 模板类的前向声明还是头一次见到:template <typename T> class QList;现在不会用……以后研究,看样子Qt的源码真的非常复杂哦。
QObject::d_ptr->metaObject 只被用于动态元对象(QML对象),通常虚函数metaObject() 只是返回类的staticMetaObject 。 staticMetaObject被创建为只读数据。qobjectdefs.h 文件中QMetaObject的定义如下: AI检测代码解析 struct QMetaObject { /* ... Skiped all the public functions ... */ ...
1. QPointer 特点:当其指向的对象(T必须是QObject及其派生类)被销毁时,它会被自动置NULL. 注意:它本身析构时不会自动销毁所guarded的对象 用途:当你需要保存其他人所拥有的QObject对象的指针时,这点非常有 2.QScopedPointer QScopedArraytPointer与 std::unique_ptr/scoped_ptr ...
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册; 2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass"); 3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");-...