我正在使用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,
^~~~~~~
/
还有更多
最佳答案
这是不可能的。
我正在考虑使用CRTP(好奇地重复模板模式),如果您可以修改其中一个类并可以处理其限制,则可以从理论上使用它。
但这不适用于您的情况,因为ReactItem不是直接来自QQuickItem,而是来自QQuickPaintedItem。
假设情况并非如此:
ReactItem需要更改为如下所示:
template <class T> class ReactItem : public T {/*...*/};
类hiearchy将如下所示:
QQuickItem
/ \
/ QQuickFramebufferObject
/ \
ReactItem<QQuickItem> \
\
ReactItem<QQuickFramebufferObject>
/
OpenGlBufferItem
这种方法的局限在于,就类型层次结构而言,两个ReactItem实例是不相关的类型。
这意味着以前引用
ReactItem
的许多代码可能需要更改。对于函数,这很容易做到:
void f(ReactItem* item) { item->setVisible(true); }
// becomes
template<class T> void f(ReactItem<T>* item) { item->setVisible(true); }
对于像
std::vector<ReactItem*>
这样的模板数据成员而言,这要麻烦得多。关于c++ - 为Qt类解决此特定的C++ Diamond问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55210837/