Qt:如何继承QQuickPath类

时间:2015-03-06 14:28:54

标签: c++ qt qml

我想创建一个继承MyPath的新类QQuickPath。据我所知,QQuickPath是私人班级。这样做有“干净”的方法吗?

我的目的是创建自定义QML类型MyPath,它使用QPainterPath QQuickPath属性(根据this link)具有一些扩展功能。

感谢您的帮助。

修改

Qt Creator现在能够建议QQuickPath,但编译失败。

我按照@michał-w-urbańczyk发布的说明创建了这个类标题

#ifndef C_H
#define C_H

#include <QtQuick/private/qquickpath_p.h>
#include <QObject>

class C : public QQuickPath
{
    Q_OBJECT
public:
    C(QObject *parent = 0);
    ~C();

signals:

public slots:
};

#endif // C_H

和源文件

 #include "c.h"

 C::C(QObject *parent)
  : QQuickPath(parent)
 {
 }

 C::~C()
 {
 }

我收到了这些错误:

c.o: In function `C::C(QObject*)':
../app/gui/c.cpp:4: undefined reference to `QQuickPath::QQuickPath(QObject*)'
c.o: In function `C::~C()':
../app/gui/c.cpp:8: undefined reference to `QQuickPath::~QQuickPath()'
moc_c.o: In function `C::qt_metacast(char const*)':
../app/moc_c.cpp:79: undefined reference to `QQuickPath::qt_metacast(char const*)'
moc_c.o: In function `C::qt_metacall(QMetaObject::Call, int, void**)':
../app/moc_c.cpp:84: undefined reference to `QQuickPath::qt_metacall(QMetaObject::Call, int, void**)'
moc_c.o:(.data.rel.ro+0x0): undefined reference to `QQuickPath::staticMetaObject'
moc_c.o:(.data.rel.ro._ZTV1C[_ZTV1C]+0x70): undefined reference to `QQuickPath::componentComplete()'
moc_c.o:(.data.rel.ro._ZTV1C[_ZTV1C]+0x78): undefined reference to `QQuickPath::classBegin()'
moc_c.o:(.data.rel.ro._ZTV1C[_ZTV1C]+0xa0): undefined reference to `non-virtual thunk to QQuickPath::classBegin()'
moc_c.o:(.data.rel.ro._ZTV1C[_ZTV1C]+0xa8): undefined reference to `non-virtual thunk to QQuickPath::componentComplete()'
moc_c.o:(.data.rel.ro._ZTI1C[_ZTI1C]+0x10): undefined reference to `typeinfo for QQuickPath'

由于

1 个答案:

答案 0 :(得分:3)

简短回答:Qt不支持这种情况,所以没有“干净”的方法来做到这一点。如果你真的有决心,可以在使用Qt的开发者版本时实现。

答案很长: Qt确实提供了访问其私有头文件的支持(其中私有类如`QQuickPath1定义),但这还不够。显然,在使用官方Qt二进制分发时,不可能继承私有Qt类,因为它似乎没有必要的QQuickPath相关方法。

然而,我能够通过从官方源代码包构建Qt来实现这一目标。根据配置选项,可以访问必要的方法。我已经使用传递给-developer-build的{​​{1}}选项构建了Qt - 它显然定义了导出非Qt代码所需的符号的configure宏,以便能够继承Qt私有类。

来自QT_BUILD_INTERNAL的以下评论似乎相关:

/*
   No, this is not an evil backdoor. QT_BUILD_INTERNAL just exports more symbols
   for Qt's internal unit tests. If you want slower loading times and more
   symbols that can vanish from version to version, feel free to define QT_BUILD_INTERNAL.
*/

整个事情是可能的,但显然不推荐,因为您的应用程序将需要自定义Qt二进制文件构建。如果您已经准备好接受这样的缺点(除了使用Qt私有标头的其他缺点,例如放弃与未来Qt 5版本的二进制兼容性),请自行构建Qt并定义所述标志,并按照以下说明操作。

首先,您需要向qglobal.h文件添加适当的信息,以便qmake将私有包含目录添加到包含路径。 与.pro构建选项一起,您需要提供quick。由于quick-private包含依赖项,您还需要添加QQuickPathqml-private。最后,您将在gui-private文件中以这样的结尾结束:

.pro

如果您没有使用qmake来构建项目,那么您需要手动添加priovate包含的文件夹路径。私人包括在以下位置: QT += qml quick quick-private qml-private gui-private

然后只需将包含<QtDir>/include/<ModuleName>/<QtVersion>/<ModuleName>/private的include添加到您的某个文件中,并定义派生类型:

QQuickPath