2015-03-06 4 views
3

Я хотел бы создать новый класс MyPath, который наследует QQuickPath. Насколько я узнал, QQuickPath - частный класс. Есть ли «чистый» способ сделать это?Qt: Как наследовать класс QQuickPath

Моя цель создает пользовательский тип QML MyPath который имеет некоторые расширенные функциональные возможности, используя QPainterPath atribute из QQuickPath (по this link).

Спасибо за помощь.

Edit:

Qt Creator теперь может предложить QQuickPath но компиляция терпит неудачу.

Я следовал инструкциям, которые разместил @ Michal-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' 

Thanks

+0

Да ... Я обнаружил, что я получаю то же самое ошибки, когда вы используете официальные двоичные файлы Qt. Он работает, однако, когда я строю Qt из исходного кода самостоятельно (что я вообще делаю, чтобы получить символы отладки). Я посмотрю на это ближе через день или два. –

+0

Думаю, у меня это есть. Я считаю его макросом 'QT_BUILD_INTERNAL'. Я обновил свой ответ. Если у вас возникнут какие-либо проблемы, напишите комментарий к моему ответу - я не получаю уведомление при редактировании вопроса. –

ответ

3

Короткий ответ: такой сценарий не поддерживается Qt, поэтому нет «чистого» способа сделать это. Если вы действительно настроены, это можно достичь при использовании сборки разработчика Qt.

Долгий ответ: Qt предоставляет поддержку для доступа к своим закрытым заголовкам (где частные классы, такие как `QQuickPath1, определенные), но этого недостаточно. По-видимому, невозможно наследовать частный Qt-класс при использовании официального бинарного дистрибутива Qt, поскольку у него нет необходимых методов QQuickPath.

Я мог бы получить эту работу, построив Qt из официального пакета исходного кода. В зависимости от параметров конфигурации необходимые методы могут стать доступными. Я построил Qt с опцией -developer-build, переданной в configure - он, по-видимому, определяет макрос QT_BUILD_INTERNAL, который экспортирует символы, необходимые для того, чтобы не-Qt-код мог наследовать частные классы Qt.

Следующий комментарий от qglobal.h кажется уместным:

 
/* 
    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 самостоятельно с указанным флагом и следуйте приведенным ниже инструкциям.

Прежде всего, вам нужно добавить соответствующую информацию в файл .pro, поэтому qmake добавит личные включенные каталоги в путь включения. Наряду с опцией quick, вам необходимо указать quick-private. Из-за QQuickPath включите зависимости, вам нужно будет добавить qml-private и .В конце концов, вы в конечном что-то вроде этого в файле .pro:

QT += qml quick quick-private qml-private gui-private

Если вы не используете QMAKE построить свой проект, то вам нужно добавить путь к папке с priovate включает в себя вручную. Частный включает находятся в таких местах, как: <QtDir>/include/<ModuleName>/<QtVersion>/<ModuleName>/private

Затем просто добавьте включают в QQuickPath к одному из файлов и определить производный тип:

#include <QtQuick/private/qquickpath_p.h> 

class MyPath : public QQuickPath 
{ 
    Q_OBJECT 
public: 
    // any additional code 
}; 
Смежные вопросы