QSGNode可以继承QObject吗?

时间:2014-11-10 22:29:47

标签: qt scenegraph

QSGNode可以继承QObject并连接信号和插槽吗?我已经尝试过但只在渲染完成时调用了插槽。

我有一个细胞矩阵。我正在使用QML在二维ListView上显示它们(ListView在每个委托中都有一个ListView)。这缺乏性能所以我改为SceneGraph。问题是数据模型。我现在传递一个QList,其中列有一个QList。每行都有具有信号的单元格。这个细胞改变了。我想通知这些信号的渲染更新。我的解决方案,直到我有一个更好的解决方案是让每个单元格在相应的列上触发一个更改的信号,然后它将转动实现该场景的主QQuickItem上的更新标志。

想法?

2 个答案:

答案 0 :(得分:1)

您应该将模型中的信号连接到处理QSGNode的QQuickItem,而不是直接连接到QSGNode。 QSGNode对象应该仅在QSGRenderingThread内处理。

QObjects'live'只在一个帖子中。这是它们发射和接收信号的线程。通过使你的QSGNode成为QObject,你必须注意发射和接收线程,否则你会得到像你描述的那样的症状。除非在建立连接时指定Qt::DirectConnection,否则如果信号从一个线程发出并从另一个线程中的对象接收,则信号将转换为消息,稍后将使用{{1}调度}。

一个好的做法是建立一个类似于Qt示例中提供的结构:

QQuickItem处理信号连接并存储属性。根据更改的内容,QQuickItem会向QSGNode发送命令,以重新计算其几何体的某些部分。这只能通过QEventLoop

完成

答案 1 :(得分:0)

QSGNode本身不支持signalslot。但如果你想,你可以做双重继承。

#include <QObject>
#include <QSGNode>

class Foo : public QObject, public QSGNode    {
     Q_OBJECT
     // Your additional implementation here
};