Russian Qt Forum

Qt => Qt Quick => Тема начата: SektorCT от Апрель 25, 2020, 19:18



Название: Ошибка при работе со Scebe Graph
Отправлено: SektorCT от Апрель 25, 2020, 19:18
Всем привет.
Так как paint уходит на вторйо план по скорости работы и отрисовки то решил переписать на scene graph все руботу.
И как бы все обьекты работают, но вот одна ошибка не дает покоя(замедление работы очень сильное), и возможно это влечет за собою замедление работы.

QMLIcon_QML_64 : Update called for a item without content
QMLIcon_QML_65 : Update called for a item without content
QMLIcon : Update called for a item without content
QMLIcon : Update called for a item without content
QMLIcon : Update called for a item without content
QMLIcon : Update called for a item without content

Сам код данного класса выглядит вот так, кидаю старую реализацию и новую

Код:
//void QMLIcon::paint(QPainter *painter)
//{
//    painter->save();
//    QRectF rect = boundingRect();
//
//    QPen pen(m_color);
//    painter->setPen(pen);
//
//    QBrush brush(m_color);
//    painter->setBrush(brush);
//
//    QTransform transform;
//    transform.translate(rect.center().x(), rect.center().y());
//    painter->setTransform(transform, true);
//
//    iconDatabase::drawIcon(painter, m_icon);
//    painter->restore();
//}

QSGNode *QMLIcon::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData)
{
    Q_UNUSED(updatePaintNodeData)

    QImage canvas(boundingRect().width(), boundingRect().height(), QImage::Format_RGBA8888);
    canvas.fill(QColor("transparent"));

    QPainter painter(&canvas);
    painter.save();

    QPen pen(m_color);
    painter.setPen(pen);

    QBrush brush(m_color);
    painter.setBrush(brush);

    QTransform transform;
    transform.translate(boundingRect().center().x(), boundingRect().center().y());
    painter.setTransform(transform, true);

    iconDatabase::drawIcon(&painter, m_icon);
    painter.restore();

    auto pTexture = window()->createTextureFromImage(canvas);

    if(!oldNode)
    {
        m_pTextureNode = new QSGSimpleTextureNode;
        m_pTextureNode->setRect(boundingRect());
        m_pTextureNode->setTexture(pTexture);

        return m_pTextureNode;
    }

    m_pTextureNode->setTexture(pTexture);
    return oldNode;
}

Надеюсь что те кто работали со scene graph отзовутся, не поулчается найти причину ошибки.
Заранее спасибо.


Название: Re: Ошибка при работе со Scebe Graph
Отправлено: SektorCT от Апрель 25, 2020, 19:25
Нашел сам вонинг, но вот почему он срабатывает не понятно
https://code.woboq.org/qt5/qtdeclarative/src/quick/items/qquickitem.cpp.html (https://code.woboq.org/qt5/qtdeclarative/src/quick/items/qquickitem.cpp.html)


Название: Re: Ошибка при работе со Scebe Graph
Отправлено: navrocky от Май 29, 2020, 18:38
Почему бы просто не взять вот этот класс, который как раз и предназначен для рисования через QPainter ?

https://doc.qt.io/qt-5/qtquick-customitems-painteditem-example.html