请教怎么调用QTableViewPrivate的非内联函数
请问如何调用QTableViewPrivate的非内联函数?通常,访问一个Qt类的私有类的成员时,只需要定义一个派生类继
请问如何调用QTableViewPrivate的非内联函数?
通常,访问一个Qt类的私有类的成员时,只需要定义一个派生类继承该Qt类,在派生类的private域中定义Q_DECLARE_PRIVATE宏,在实现代码中定义Q_D宏即可通过d变量实现对Qt私有类成员的访问,但我在继承QTableView的过程中却遇到了一些问题,代码如下:
头文件:
C/C++ code#include <QTableView>#include <QTableView>class SpreadsheetPrivate;class Spreadsheet : public QTableView{ Q_OBJECTpublic: Spreadsheet(); void test(); protected:private: Q_DECLARE_PRIVATE(Spreadsheet)};
源文件:
C/C++ code#include <QtGui>#include <private/qtableview_p.h>#include "Spreadsheet.h"class SpreadsheetPrivate: public QTableViewPrivate{};Spreadsheet::Spreadsheet(){}void Spreadsheet::test(){ Q_D(Spreadsheet); //在这里出现问题}
问题是,在注释的地方调用QTableViewPrivate的成员变量或内联函数时,代码的编译和链接都没有问题;但是,如果调用QTableViewPrivate的普通成员函数,则编译没有问题,链接时会出现“undefined reference to ‘QTableViewPrivate::xxxx()’"错误(xxxx代码调用的函数名) 。查看Qt源代码,QTableView对基类私有类的调用也与上述方式一致。这个问题一直困扰着我。
请问大家这个问题出现的原因是什么?应该怎样才能正确调用基类私有类的成员函数呢?谢谢!
[解决办法]私有(private)成员通过这样的办法是没办法调用的。
你这个办法可以调用保护(protected)
[解决办法]因为qtgui.dll中没有导出QTableViewPrivate的符号表,所以需要自己加入QTableViewPrivate的实现。
找到qt源代码中的QTableView.cpp,把其中的QTableViewPrivate实现提出来放到一个单独的cpp里,比如叫QTableViewPrivate.cpp。另外我试了试QTableViewPrivate还依赖QAbstractItemViewPrivate,同样,自己再建一个QAbstractItemViewPrivate.cpp,添加QAbstractItemViewPrivate的实现,这样就行了