[Qt] Как принято рисовать?
От: Sheridan Россия  
Дата: 04.12.09 22:18
Оценка:
Приветствую!
Пытаюсь рисовать... QGraphicsScene, QGraphicsView и несколько QGraphicsItem, унаследованные от общего родителя
Рисую в QGraphicsItem::paint(...) — заметные тормоза.
Родитель:
void CGraphicsItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
    painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing, true);
    #ifndef QT_NO_DEBUG
        painter->setPen(QPen(QBrush(QColor("firebrick")), 1, Qt::DashLine));
        painter->drawRect(boundingRect());
    #endif
    painter->setPen(_stdPen);
    painter->setBrush(_stdBrush);
    painter->setFont(_stdFont);
    paint(painter);
}

Один из потомков (самый ресурсоемкий)
void CSattelitesBackground::paint(QPainter * painter)
{

    // circles
    for(int i = 90; i >= 10; i -= 10)
    {
        _circleGradient.setRadius(scale(i));
        painter->setBrush(QBrush(_circleGradient));
        painter->drawEllipse(getCircle(0,0,scale(i)));
    }
    painter->setBrush(_stdBrush);

    // lines
    for(int i = 0; i < 360; i+=__lineAnglesStep)
    {
        painter->drawLine(getLine(scale(5),i,scale(95),i));
    }

    //text
    painter->setFont(_elevationFont);
    for(int i = 90; i >= 10; i -= 10)
    {
        for(int j = 0; j < 360; j+=__lineAnglesStep)
        {
            painter->drawText(QRectF(scale(1), -scale(i), scale(8), scale(5)), Qt::AlignLeft, QString("%1").arg(90 - i));
            painter->rotate(__lineAnglesStep);
        }
    }
    painter->setFont(_azimuthFont);
    for(int i = 0; i < 360; i+=__lineAnglesStep)
    {
        painter->drawText(QRectF(scale(1), -scale(98), scale(20), scale(8)), Qt::AlignLeft, QString("%1%2").arg(i).arg(QChar(176)));
        painter->rotate(__lineAnglesStep);
    }
    painter->setFont(_wSidesFont);
    painter->drawText(QRectF(-scale(15), -scale(110), scale(30), scale(10)), Qt::AlignCenter, QObject::tr("North"));
    painter->rotate(90);
    painter->drawText(QRectF(-scale(15), -scale(110), scale(30), scale(10)), Qt::AlignCenter, QObject::tr("East"));
    painter->rotate(90);
    painter->drawText(QRectF(-scale(15), -scale(110), scale(30), scale(10)), Qt::AlignCenter, QObject::tr("South"));
    painter->rotate(90);
    painter->drawText(QRectF(-scale(15), -scale(110), scale(30), scale(10)), Qt::AlignCenter, QObject::tr("West"));
    painter->rotate(90);

}

Что я делаю не так? Как можно по другому?
avalon 1.0rc3 rev 306, zlib 1.2.3 (02.12.2009 18:36:32 MSK +03:00)(Qt 4.6.0)

21.01.10 02:05: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Matrix has you...
Re: [Qt] Как принято рисовать?
От: Mamut Швеция http://dmitriid.com
Дата: 05.12.09 07:54
Оценка:
S>Приветствую!
S>Пытаюсь рисовать... QGraphicsScene, QGraphicsView и несколько QGraphicsItem, унаследованные от общего родителя
S>Рисую в QGraphicsItem::paint(...) — заметные тормоза.

S>Что я делаю не так? Как можно по другому?


Могу предположить, что надо отключить собственно прорисовку чего-либо до тех пор, пока все не будет нарисовано (что-то типа setupdates(off), setupdates(on)).


dmitriid.comGitHubLinkedIn
Re: [Qt] Как принято рисовать?
От: little_alex  
Дата: 05.12.09 08:03
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Что я делаю не так? Как можно по другому?

Судя по коду, картинка у тебя статическая. Ее можно один раз нарисовать в QPixmap с прозрачностью, а потом просто рисовать этот pixmap одной функцией.
Re[2]: [Qt] Как принято рисовать?
От: Sheridan Россия  
Дата: 05.12.09 09:12
Оценка:
Приветствую, little_alex, вы писали:

l> Судя по коду, картинка у тебя статическая. Ее можно один раз нарисовать в QPixmap с прозрачностью, а потом просто рисовать этот pixmap одной функцией.

Она масштабируется и вертится....
avalon 1.0rc3 rev 306, zlib 1.2.3 (02.12.2009 18:36:32 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[3]: [Qt] Как принято рисовать?
От: little_alex  
Дата: 05.12.09 16:40
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, little_alex, вы писали:


l>> Судя по коду, картинка у тебя статическая. Ее можно один раз нарисовать в QPixmap с прозрачностью, а потом просто рисовать этот pixmap одной функцией.

S>Она масштабируется и вертится....
Ничего страшного — можно запоминать картинку для каждого положения.
Подробнее смотри http://doc.trolltech.com/qq/qq12-qpixmapcache.html и доку на QPixmapCache.
Re: [Qt] Как принято рисовать?
От: little_alex  
Дата: 05.12.09 16:52
Оценка: 16 (2)
Здравствуйте, Sheridan, Вы писали:

S>Что я делаю не так? Как можно по другому?


Можно еще OpenGL использовать, там где он быстрый.

To enable OpenGL rendering, you simply set a new QGLWidget as the viewport of QGraphicsView by calling QGraphicsView::setViewport(). If you want OpenGL with antialiasing, you need OpenGL sample buffer support (see QGLFormat::sampleBuffers()).
Example:

QGraphicsView view(&scene);
view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

Re[2]: [Qt] Как принято рисовать?
От: Sheridan Россия  
Дата: 05.12.09 17:40
Оценка:
Приветствую, little_alex, вы писали:

l> Можно еще OpenGL использовать, там где он быстрый.

l>

l> To enable OpenGL rendering, you simply set a new QGLWidget as the viewport of QGraphicsView by calling QGraphicsView::setViewport(). If you want OpenGL with antialiasing, you need OpenGL sample buffer support (see QGLFormat::sampleBuffers()).
l> Example:

l> QGraphicsView view(&scene);
l> view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

я думал об этом... Но как будут дела обстоять там где opengl нет?
avalon 1.0rc3 rev 306, zlib 1.2.3 (02.12.2009 18:36:32 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[4]: [Qt] Как принято рисовать?
От: Sheridan Россия  
Дата: 05.12.09 17:40
Оценка:
Приветствую, little_alex, вы писали:

l> S>Она масштабируется и вертится....


l> Ничего страшного — можно запоминать картинку для каждого положения.

l> Подробнее смотри http://doc.trolltech.com/qq/qq12-qpixmapcache.html и доку на QPixmapCache.
Минимум 360 пиксмапов... Не будет ли оно память откусывать много?
avalon 1.0rc3 rev 306, zlib 1.2.3 (02.12.2009 18:36:32 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[5]: [Qt] Как принято рисовать?
От: little_alex  
Дата: 05.12.09 17:54
Оценка: 16 (2)
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, little_alex, вы писали:


l>> S>Она масштабируется и вертится....


l>> Ничего страшного — можно запоминать картинку для каждого положения.

l>> Подробнее смотри http://doc.trolltech.com/qq/qq12-qpixmapcache.html и доку на QPixmapCache.
S>Минимум 360 пиксмапов... Не будет ли оно память откусывать много?

Размер кеша можно задать. Все, что не помещается в него (или вытеснено более новыми pixmap-ами), придется рисовать еще раз. Памяти много ИМХО не надо, достаточно, чтобы в кеш уместились несколько последних картинок.

В пользу этого способа то, что стандартные widget-ы qt именно так рисуются.
Re[3]: [Qt] Как принято рисовать?
От: little_alex  
Дата: 05.12.09 18:00
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, little_alex, вы писали:


l>> Можно еще OpenGL использовать, там где он быстрый.


S>я думал об этом... Но как будут дела обстоять там где opengl нет?


Ну если OpenGL вообще нет, то не соберется QtOpenGL. А случай, что он медленный надо как-то определять ...

PS. QtDemo дико тормозит там, где OpenGL медленный ( не аппаратный )
Re[6]: [Qt] Как принято рисовать?
От: little_alex  
Дата: 05.12.09 18:06
Оценка: 4 (1)
Здравствуйте, little_alex, Вы писали:

_>Размер кеша можно задать. Все, что не помещается в него (или вытеснено более новыми pixmap-ами), придется рисовать еще раз. Памяти много ИМХО не надо, достаточно, чтобы в кеш уместились несколько последних картинок.


_>В пользу этого способа то, что стандартные widget-ы qt именно так рисуются.


Тем более, что это уже реализовано и надо только включить:
void QGraphicsItem::setCacheMode(CacheMode mode, const QSize &logicalCacheSize);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.