Russian Qt Forum
Ноябрь 25, 2024, 19:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка при работе со Scebe Graph  (Прочитано 6159 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« : Апрель 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 отзовутся, не поулчается найти причину ошибки.
Заранее спасибо.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #1 : Апрель 25, 2020, 19:25 »

Нашел сам вонинг, но вот почему он срабатывает не понятно
https://code.woboq.org/qt5/qtdeclarative/src/quick/items/qquickitem.cpp.html
Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #2 : Май 29, 2020, 18:38 »

Почему бы просто не взять вот этот класс, который как раз и предназначен для рисования через QPainter ?

https://doc.qt.io/qt-5/qtquick-customitems-painteditem-example.html
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 23.