0

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

我有一个细胞矩阵。我正在使用 QML 在二维 ListView 上显示它们(每个委托都有一个 ListView 的 ListView)。这缺乏性能,所以我改为使用 SceneGraph。问题是数据模型。我现在正在传递一个 QList,其中 column 有一个 QList。每行都有具有信号的单元格。这些细胞发生变化。我想通知这些信号的渲染更新。在我有更好的解决方案之前,我的解决方案是让每个单元格在各自的列上触发一个更改的信号,这反过来将打开实现场景的主 QQuickItem 上的更新标志。

想法?

4

2 回答 2

1

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

QObjects 只存在于一个线程中。这是它们发出和接收信号的线程。通过使您的 QSGNode 成为 QObject,您必须注意发送和接收线程,否则您会得到与您描述的症状类似的症状。除非您Qt::DirectConnection在建立连接时指定,否则如果信号从一个线程发出并从另一个线程中的对象接收,则信号将转换为消息,稍后将使用QEventLoop.

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

QQuickItem 处理信号连接并存储属性。根据发生的变化,QQuickItem 向 QSGNode 发送命令以重新计算其几何的某些部分。这只能通过QQuickItem::updatePaintNode()

于 2015-05-30T21:56:28.967 回答
0

AQSGNode本身不能支持signals 和slots。但如果你愿意,你可以做双重继承。

#include <QObject>
#include <QSGNode>

class Foo : public QObject, public QSGNode    {
     Q_OBJECT
     // Your additional implementation here
};
于 2014-11-11T01:02:28.223 回答