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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: тормозит QPainter у QWidget  (Прочитано 12293 раз)
Alex03
Гость
« Ответ #15 : Январь 25, 2007, 12:12 »

Вручную на примере 3.х.х
Добовляете в свой MainWindow
QPixmap bgPixmap;
Во время инициализации, и при ресайзинге окна рисуете в этом bgPixmap всё что душе угодно с любыми антиалиасингами и т.д.
Ну а Ваш paintEvent() Заменяете на чтото типа:
Код:

void MainWindow::paintEvent(QPaintEvent *  event )
{
    QPainter painter(this);
    QRect r = event->rect();
    painter.drawPixmap(r.topLeft(), bgPixmap, r);
}
Записан
chezz
Гость
« Ответ #16 : Март 11, 2007, 05:08 »

Цитата: "Alex03"
Вручную на примере 3.х.х
Добовляете в свой MainWindow
QPixmap bgPixmap;
Во время инициализации, и при ресайзинге окна рисуете в этом bgPixmap всё что душе угодно с любыми антиалиасингами и т.д.
Ну а Ваш paintEvent() Заменяете на чтото типа:
Код:

void MainWindow::paintEvent(QPaintEvent *  event )
{
    QPainter painter(this);
    QRect r = event->rect();
    painter.drawPixmap(r.topLeft(), bgPixmap, r);
}


Хмм. Имею вот такой кусок кода:
Код:
void TestWidget::paintEvent(QPaintEvent * paintEvent)
{
QPainter painter(this);
draw();
painter.drawPixmap(paintEvent->rect(), bufferPixmap);
painter.end();
}

void TestWidget::draw()
{
bufferPixmap = QPixmap(size());
bufferPixmap.fill(Qt::transparent);
QPainter painter(&bufferPixmap);
painter.setRenderHint(QPainter::Antialiasing, true);
QPolygon polyline;
const int N = 40;
for(int i = 0; i < N; i++)
{
polyline.append(QPoint(i*width()/N, height()*(i%2)));
}
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine));
painter.drawPolyline(polyline);
}

то есть отрисовка ломаной из 40 линий, геометрия которой задается размерами виджета.
Без антиалиасинга работает ...ну достаточно быстро. С антиалиасингом - жуткие тормоза. Ресайзинг жду секунду/полторы.
Железо - 640 оперативы, ~1900 проц, видюха - geforce4 MX 64Mb
(да и на компе помощнее на работе такой же результат)
Qt 4.2.2 коммерческий.
Кто-нить знает почему так? То есть это баг или фича?
Я вот держу в руках QWT-5 и смотрю на примеры типа realtime_plot, data_plot и cpuplot. Последний с антиалиасингом при таймере на 50 мс летает при резайсинге (то есть перерисовка с нуля выполняется быстро). У меня же все тупит в более элементарном случае.
Может кто подскажет, какие такие хитрости используются в QWT (которые я может упустил, когда пробегал исходники) ?
Записан
Alex03
Гость
« Ответ #17 : Март 11, 2007, 10:26 »

Не надо draw() вызывать из paintEvent()-а
Вызывайте draw() только при:
- инициализации
- ресайзинге
- Изменении содержимого.

Плюс для TestWidget выключите очистку фона (если этого не сделано)
Записан
chezz
Гость
« Ответ #18 : Март 12, 2007, 03:33 »

Цитата: "Alex03"
Не надо draw() вызывать из paintEvent()-а
Вызывайте draw() только при:
- инициализации
- ресайзинге
- Изменении содержимого.

Плюс для TestWidget выключите очистку фона (если этого не сделано)

Ну это уже некоторое буквоедство... Понятно, что писать так грамотней, но это не изменяет сути проблемы.
Факт на лицо: антиалиасинг выключен - всё относительно быстро рисуется, включен - тормозит. Думаю, что это явно локализует проблемное место - антиалиасинг, а не неуместный вызов draw() (да и потом переделал уже код и вызываю draw() там где надо - эффект тот же...)

Так что вопрос остается открытым:
Есть факт, указывающий на антиалиасинг как причину тормозов.
Вопрос - это баг и стоит надеяться на лучшее? Или же это фича и стоит смириться и искать альтернативу?..
Вообще ведь тот же cpuplot из qwt при ресайзинге ведет себя очень шустро, а там антиалиасинг и куча кривых, заливок и т.п.
Так что все же было бы интересно услышать некоторые комментарии по QWT - можт кто глубже копал исходники или просто знает методы быстрого рисования QPainter'ом по QWidget'у?
Записан
Alex03
Гость
« Ответ #19 : Март 12, 2007, 14:09 »

А встроенная видюха имеет свой иксовый драйвер, или какойнить универсальный пользует?
Записан
chezz
Гость
« Ответ #20 : Март 12, 2007, 15:09 »

А кто сказал, что она встроенная? :?
Обычная видюха, драйвер с дисочка. Да и потом думаю и она здесь ни при чем - ведь примерчик cpuplot из qwt летает на ура, на той же видюхе... Значит видимо проблема в коде. Неужели qwt как-то по-другому рисует (не как я через QPixmap) и при этом получается гораздо быстрее? Проще, чем у меня, я придумать не могу...
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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