我通过扩展QQuickItem并重写updatePaintNode()函数创建了一个自定义的QML元素。由于我需要在时间线上绘制随着实时增长的矩形,因此需要在每个新帧中重新绘制GUI。
是否有一种方式可以使updatePaintNode()函数定期执行以便在每个新帧中重绘?
我曾尝试调用node->markDirty(QSGNode::DirtyForceUpdate),但此操作并未导致updatePaintNode()函数被定期调用。
编辑:这是我的代码示例:
是否有一种方式可以使updatePaintNode()函数定期执行以便在每个新帧中重绘?
我曾尝试调用node->markDirty(QSGNode::DirtyForceUpdate),但此操作并未导致updatePaintNode()函数被定期调用。
编辑:这是我的代码示例:
QSGNode *PianoRoll::updatePaintNode(QSGNode *n, QQuickItem::UpdatePaintNodeData *data)
{
QSGGeometryNode *node = static_cast<QSGGeometryNode *>(n);
if (!node)
{
node = new QSGSimpleRectNode(boundingRect(), Qt::white);
}
node->removeAllChildNodes();
qreal msPerScreen = 10000;
qreal pitchesPerScreen = 128;
qreal x_factor = (qreal) boundingRect().width() / msPerScreen;
qreal y_factor = (qreal) boundingRect().height() / pitchesPerScreen;
for (unsigned int i = 0; i < m_stream->notes.size(); i++)
{
shared_ptr<Note> note = m_stream->notes.at(i);
qreal left = boundingRect().left() + note->getTime() * x_factor;
qreal top = boundingRect().top() + note->getPitch() * y_factor;
qreal width;
qreal height = y_factor;
if (note->getDuration() != 0)
{
width = note->getDuration() * x_factor;
}
else
{
// TODO
width = 500 * x_factor;
}
QRectF noteRectangle = QRectF(left, top, width, height);
node->appendChildNode(new QSGSimpleRectNode(noteRectangle, Qt::black));
}
node->markDirty(QSGNode::DirtyForceUpdate);
return node;
}