大家好,电脑指针下载相信很多的网友都不是很明白,包括Qt中的Q_D宏和d指针也是一样,不过没有关系,接下来就来为大家分享关于电脑指针下载和Qt中的Q_D宏和d指针的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
Q_D的设置意在方便地获取私有类指针,文件为qglobal.h。下面的是宏定义的连字符。假设类名是A,那么APrivate翻译过来就是APrivate。
defineQ_DECLARE_PRIVATE(Class)\\\ninlineClassPrivate*d_func(){returnreinterpret_cast<ClassPrivate*>(qGetPtrHelper(d_ptr));}\\\ninlineconstClassPrivate*d_func()const{returnreinterpret_cast<constClassPrivate*>(qGetPtrHelper(d_ptr));}\\\nfriendclassClassPrivate;
这里的d_func()虽然在宏里面,但是如果代入具体的类型,这里面就变成了以ClassPrivate的私有类指针为返回值,以func为函数名的函数。这里的qGetPtrHelper是
template<typenameT>staticinlineT*qGetPtrHelper(T*ptr){returnptr;}
这个模板函数里面里的T要套入某个具体的类。上面的那个Q_DECLARE_PRIVATE里面的就成了这个模板类的一个调用。这个模板类就是把这个类指针转换成了静态的。有了上面的这三段代码,如果想在某个类A里面声明一个私有类,直接来一个Q_D(A),再Q_DECLARE_PRIVATE(A)就可以了。
二、宏和模板的展开
展开前一个宏和后一个宏的一部分,成了
39;MyQFileSystemModel::MyQFileSystemModel()&39;QFileSystemModelPrivate*QFileSystemModel::d_func()&39;Q_DECLARE_PRIVATE&defineQ_D(Class)ClassPrivate*constd=d_func()\n^\n..\\student\\myqfilesystemmodel.cpp:5:5:note:inexpansionofmacro&39;\nQ_D(constQFileSystemModel);\n^\nC:\\Qt\\Qt5.9.2\\5.9.2\\mingw53_32\\include/QtCore/qglobal.h:1016:43:warning:unusedvariable&39;[-Wunused-variable]\n39;Q_D&ifndefMYQFILESYSTEMMODEL_P_H\ninclude<myqfilesystemmodel.h>\nclassMyQFileSystemModelPrivate;\nclassMyQFileSystemModel;\nQT_BEGIN_NAMESPACE\nclassMyQFileSystemModelPrivate:publicQFileSystemModelPrivate\n{\npublic:\n//MyQFileSystemModelPrivate(MyQFileSystemModel*parent):q_ptr(parent){}\npublic:\nQ_DECLARE_PUBLIC(MyQFileSystemModel)\nMyQFileSystemModel*q_ptr;\n};\nQT_END_NAMESPACE\n39;QObject*&39;MyQFileSystemModel*'\ninlineClass*q_func(){returnstatic_cast<Class*>(q_ptr);}\\\n^
五、私有类函数调用
Qt中的公有类和私有类关系密切,私有类的函数是不能够直接使用的。要是想用,一定要通过其他类调用。在Qt编译的时候,QFileSystemModel.h是一堆声明,会导出很多函数到QtWidget.dll里面去。值得注意的是,这里导出的只是这个文件里所声明的类、函数和变量,而不会导出只在私有类头文件QFileSystemModel_p.h里面声明过的函数和变量。
当然,编译的时候,也会引用QFileSystemModelPrivate.h和QFileSystemModel.cpp里的声明以及定义。一般情况下,我们只是Qt的使用者,在windows系统下,只要下载安装就好,不需要自己再编译了。但是当我们想使用私有类做一些更深入的定制的时候,希望能够调直接调用私有类的成员。这时候,如果只是include了.h文件,就会报undefinedreference错误。也就是说,编译能过,链接过不了,找不到私有类成员。
解决的方法就是将对应的cpp文件也包含进工程目录里面,但这时候会有新的问题出现。有些类的实现已经编译到库函数里面了,这时候又在cpp文件重新实现,会报警告:redeclaredwithoutdllimportattribute。只需要把cpp文件中的实现函数删除掉就可以了。
虽然通过上面的方法,可以实现私有类的使用,但是值得注意的是,已经编译好的二进制文件dll里面的同名私有函数还在起着作用。还是用QFileSystemModel为例,它已经被Qt编译好放到了QWidget.dll里面了。在此dll文件里也会有QFileSystemModelPrivate的函数(只是不会有直接指向外部的声明,外部不能直接链接引用而已),否则私有类就完全没用了。当新的工程要使用到QFileSystemModel,而QFileSystemModelPrivate被间接地引用,使用的版本就是之前编译好的成品。当新的工程要直接调用私有类函数的时候,才是用的新的版本。
用Dependency打开Qt5Widgets.dll看到私有类的函数名形式如下:
_ZN16QFileSystemModelC1ER23QFileSystemModelPrivateP7QObject
这可能只是一个构造函数,在Qt5Widgets.dll里只有两个上面这种QFileSystemModelPrivate的函数,可见大多数私有类的函数没有导出。而直接用本节方法编译出来的QFileSystemModelPrivate.dll里面的私有成员函数形式如下:
_ZNK23QFileSystemModelPrivate4nodeERK11QModelIndex
代表形参是QModelIndex的私有类函数node,像这样的函数还有很多,它们与私有类的.h文件能够对应起来。
关于电脑指针下载的内容到此结束,希望对大家有所帮助。
