我正在使用QT的QQuickFramebufferObject
类,该类继承自Qt库中的QQuickItem
。
我有以下用户定义的类:
class OpenGlBufferItem: public QQuickFramebufferObject
我需要我的OpenGlBufferItem
类也要从ReactItem
派生。问题在于,ReactItem
最终也源自QQuickItem
:
class ReactItem : public QQuickPaintedItem
因为QQuickPaintedItem
继承自QQuickItem
所以我们有以下问题:
QQuickItem
/ \
/ \
QQuickPaintedItem QQuickFramebufferObject
/ \
ReactItem OpenGlBufferItem
我需要的是
QQuickItem
/ \
/ \
QQuickPaintedItem QQuickFramebufferObject
/ \
ReactItem /
\ /
\ /
OpenGlBufferItem
通常,为了解决钻石问题,我们只需声明某些类实际上是从其他类继承而来。但是,我无法声明类RectItem
,QQuickPaintedItem
,QQuickFrameBufferObject
,因为它们已经给定了。
我应该如何进行?
更新:
如果我只是想尝试
class OpenGlBufferItem: public QQuickFramebufferObject, public ReactItem
我遇到了这类错误:
Command failed: ./build.sh -e "modules/mediaplayer/desktop"
In file included from /home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/EWIEGA46WW/moc_OpenGlBufferQtQuick.cpp:9:0,
from /home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/mocs_compilation.cpp:2:
/home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/EWIEGA46WW/../../../../../../../../OpenGlBufferQtQuick.h: In constructor ‘OpenGlBufferItem::OpenGlBufferItem(QQuickItem*)’:
/home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/EWIEGA46WW/../../../../../../../../OpenGlBufferQtQuick.h:90:13: error: reference to ‘connect’ is ambiguous
connect(parent, SIGNAL(widthChanged()), this, SLOT(parentWidthChanged()));
^~~~~~~
In file included from /home/lz/Qt5.11.2/5.11.2/gcc_64/include/QtCore/QObject:1:0,
from /home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/EWIEGA46WW/../../../../../../../../OpenGlBufferQtQuick.h:3,
from /home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/EWIEGA46WW/moc_OpenGlBufferQtQuick.cpp:9,
from /home/lz/orwell/orwellJS/desktop/modules/mediaplayer/desktop/orwell_subdir/orwell_autogen/mocs_compilation.cpp:2:
/home/lz/Qt5.11.2/5.11.2/gcc_64/include/QtCore/qobject.h:308:13: note: candidates are: template<class Func1, class Func2> static typename std::enable_if<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1), QMetaObject::Connection>::type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType)
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
^~~~~~~
/home/lz/Qt5.11.2/5.11.2/gcc_64/include/QtCore/qobject.h:300:13: note: template<class Func1, class Func2> static typename std::enable_if<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1), QMetaObject::Connection>::type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
^~~~~~~
/home/lz/Qt5.11.2/5.11.2/gcc_64/include/QtCore/qobject.h:269:13: note: template<class Func1, class Func2> static typename std::enable_if<(((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction)), QMetaObject::Connection>::type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType)
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
^~~~~~~
/
还有很多
答案 0 :(得分:0)
This is not possible.
I was thinking about using the CRTP (Curiously Recurring Template Pattern), which could theorhetically be employed if you can modify one of the classes and can handle its restrictions. But it will not work in your case as ReactItem is not deriving directly from QQuickItem, but from QQuickPaintedItem.
Let's assume that was not the case:
ReactItem would need to be changed to look like this:
template <class T> class ReactItem : public T {/*...*/};
The class hiearchy would look like this:
QQuickItem
/ \
/ QQuickFramebufferObject
/ \
ReactItem<QQuickItem> \
\
ReactItem<QQuickFramebufferObject>
/
OpenGlBufferItem
The restrictions of this approach is, that the two ReactItem instantiations are unrelated types with regards to the type hierarchy.
This means a lot of the code previously referring to ReactItem
might needs to be changed.
This is quite easy to do for functions:
void f(ReactItem* item) { item->setVisible(true); }
// becomes
template<class T> void f(ReactItem<T>* item) { item->setVisible(true); }
It is a lot trickier for templated data members like std::vector<ReactItem*>
.