【问题标题】:Can QSGNode inherit QObject?QSGNode可以继承QObject吗?
【发布时间】:2014-11-10 22:29:46
【问题描述】:

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

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

想法?

【问题讨论】:

  • 你想做什么?将信号和槽附加到 QSGNode 似乎有点奇怪。
  • 我有一个单元格矩阵。我正在使用 QML 在二维 ListView 上显示它们(每个委托中都有一个 ListView 的 ListView)。这缺乏性能,所以我改为使用 SceneGraph。问题是数据模型。我现在正在传递一个 QList,其中 column 有一个 QList。每行都有具有信号的单元格。这些细胞发生变化。我想通知这些信号的渲染更新。在我有更好的解决方案之前,我的解决方案是让每个单元格在各自的列上触发一个更改的信号,这反过来将打开实现场景的主 QQuickItem 上的更新标志。想法?
  • @NunoSantos 我认为您应该将该评论添加到您的问题中。

标签: qt scenegraph


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    QSGNode 本身无法支持 signals 和 slots。但如果你愿意,你可以做双重继承。

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

    【讨论】:

    • 我已经做到了。碰巧信号/插槽仅在下一个渲染帧上被触发。想象一下,您必须调整窗口大小才能触发信号/插槽。
    • @NunoSantos 同样,我认为这需要成为您问题的一部分。您能否列出 SceneGraph 调整大小的所有原因? (例如,调整窗口大小将是一个原因。)如果您可以枚举所有这些原因,那么您似乎想要signal 对枚举的原因,not signal 来自QSGNode
    • QObject 和另一个类继承时,QObject 应该始终是第一个被继承的类。 (来自 Qt 文档)
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2011-03-04
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多