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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: тормозит QPainter у QWidget  (Прочитано 12353 раз)
izoomer
Гость
« : Январь 19, 2007, 00:13 »

Код:

void MainWindow::paintEvent(QPaintEvent *  /*event*/ )
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    QRect BackgroundRect(0, 0, 800,600);
    painter.setBrush(QBrush(Qt::black, Qt::SolidPattern));
    painter.drawRect( BackgroundRect );
}


если включена опция антиалиасинга
Код:

    painter.setRenderHint(QPainter::Antialiasing, true);

то тормозит все что на виджетет этом находится, другие виджеты ему принадлежащие, например списки медленно прокручиваются. Если этой строки нет - то все ОК. А нужно еще рисовать много чего по виджету , думаю совсем будет нереально тормозить. Чего надо сделать что бы все было как надо ?
Записан
Dendy
Гость
« Ответ #1 : Январь 19, 2007, 00:33 »

Какая ОС? Железо? Тормозит в дебаге или рилизе?
Записан
Alex03
Гость
« Ответ #2 : Январь 19, 2007, 08:09 »

ИМХО для перерисовки больших объектов у/на которых куча чилдов, не плохо на QPaintEvent объект глядеть. Может Вам приходит сотня паинтевентов на небольшие кусочки окна, а Вы при этом всё окно перерисовываете.
Ещё я не понимаю зачем Antialiasing при заливке солидом?
Записан
izoomer
Гость
« Ответ #3 : Январь 19, 2007, 20:24 »

Цитировать

Какая ОС? Железо? Тормозит в дебаге или рилизе?

Linux . Встроеная видюха на матери. Тормозит в релизе, но не думаю что это может влиять.
Цитировать

ИМХО для перерисовки больших объектов у/на которых куча чилдов, не плохо на QPaintEvent объект глядеть. Может Вам приходит сотня паинтевентов на небольшие кусочки окна, а Вы при этом всё окно перерисовываете.
Ещё я не понимаю зачем Antialiasing при заливке солидом?

Это только один из объектов рисованых, остальные нужно с антиалиасом рисовать, без него никак.
Можно развернуть ответ по поводу PaintEvent объекта ?

добавлено спустя 34 минуты:

 попробывал - тормозит как на релизе так и на дебаге.
Записан
Dendy
Гость
« Ответ #4 : Январь 19, 2007, 20:48 »

На линуксе может сильно тормозить при отсутствии расширения иксов XRender.
Записан
izoomer
Гость
« Ответ #5 : Январь 19, 2007, 20:52 »

компилится проект qt с ключем -lXrender
Записан
izoomer
Гость
« Ответ #6 : Январь 20, 2007, 15:15 »

Xrender в системе установлен
что же может быть ? как ускорить ? подскажите знающие
Записан
fanat9
Гость
« Ответ #7 : Январь 21, 2007, 17:44 »

ЧТо за видюха и какие драйвера используеются ?
Записан
izoomer
Гость
« Ответ #8 : Январь 22, 2007, 14:51 »

на данный момент видик Radeon 9550 дрова станартные - модуль radeon
Записан
Alex03
Гость
« Ответ #9 : Январь 22, 2007, 16:05 »

Цитата: "izoomer"

Можно развернуть ответ по поводу PaintEvent объекта ?

Ну там ж всё неписано.
Цитировать
The QPaintEvent class contains event parameters for paint events.

Paint events are sent to widgets that need to update themselves, for instance when part of a widget is exposed because a covering widget was moved.

The event contains a region() that needs to be updated, and a rect() that is the bounding rectangle of that region. Both are provided because many widgets can't make much use of region(), and rect() can be much faster than region().boundingRect(). Painting is clipped to region() during the processing of a paint event.


Т.е. Вас могут попросить перерисовать один пиксел, а Вы перерисовываете всё.
Например если на Вашем окне лежит одно другое прямоугольное окно (например кнопка),  к Вам может прийти 4 paintEvent-а для перерисовки всего окна. И т.д.
И если другие объекты (как то линии и т.д.) рисовать не очень клёва только для текущего прямоугольника из QPaintEvent-а, то уж фон то чистить надо всяко по этому rect-у.
Записан
izoomer
Гость
« Ответ #10 : Январь 23, 2007, 11:31 »

а как это все выгдлядит в коде ?
Записан
Alex03
Гость
« Ответ #11 : Январь 23, 2007, 13:37 »

Цитата: "izoomer"
а как это все выгдлядит в коде ?

Для Вашего примера
Код:
void MainWindow::paintEvent(QPaintEvent *  /*event*/ ) 
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    QRect BackgroundRect(0, 0, 800,600);
    painter.setBrush(QBrush(Qt::black, Qt::SolidPattern));
    painter.drawRect( BackgroundRect );
}

Например так:
Код:
void MainWindow::paintEvent(QPaintEvent *  event ) 
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    QRect BackgroundRect = event->rect();
    painter.setBrush(QBrush(Qt::black, Qt::SolidPattern));
    painter.drawRect( BackgroundRect );
}


Ну или просто попробуйте для начала просто попечатать event->rect() в консоль.

Ну а если ещё чего там рисуется то:
Код:
void MainWindow::paintEvent(QPaintEvent *  event ) 
{
    QPainter painter(this);
    QRect BackgroundRect = event->rect();
    painter.setBrush(QBrush(Qt::black, Qt::SolidPattern));
    painter.drawRect( BackgroundRect );

    painter.setRenderHint(QPainter::Antialiasing, true);
    ...
    // а тут желательно рисовать в пределах BackgroundRect
}


добавлено спустя 7 минут:

 Кстати может ещё
Код:
painter.setClipRegion(event->region());

поможет?
Записан
izoomer
Гость
« Ответ #12 : Январь 23, 2007, 18:14 »

ну так в этом случае все пройдет если нарисован один черный квадрат.
В моем случае ещё есть
Код:

    painter.setBrush(QBrush(Qt::red, Qt::SolidPattern));
    painter.drawRoundRect( MainRect, 3, 3);


да плюс ещё это квадрат градиентную заливку имеет

Как в это случае быть ?
Может можно как то по другому на фоне рисовать различные вещи с антиалиасом ?
Записан
Alex03
Гость
« Ответ #13 : Январь 24, 2007, 08:36 »

Если картинка статичная то двойная буферизация тоже рулит.
Записан
izoomer
Гость
« Ответ #14 : Январь 24, 2007, 17:50 »

нашел только
Код:

void QGLFormat::setDoubleBuffer ( bool enable )

но это для OpenGL виджета ... а у меня простой QWidget, да и двойная буферизация включена по умолчанию.
Или я что то не так понял ? можно пример для понимания ?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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