Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: pakulo от Май 05, 2007, 02:17



Название: Мерцание
Отправлено: pakulo от Май 05, 2007, 02:17
Унаследовал объект от QT класса. Рисую поверх основного виджета какой-то свой виджет. При изменении размеров главного виджета нужно изменить размер своего виджета, при этом возникает мерцание.
Я сделал так:
void MyClass::paintEvent(QPaintEvent *e)
{
     MyWidget->move(x, y);
     QWidget::paintEvent(event);
}

читал про двойную буферизацию, но не понимаю как это тут применить...

Спасибо!

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

 да, забыл...
мерцает и мой виджет и основной...


Название: Мерцание
Отправлено: Tonal от Май 05, 2007, 08:16
А стандартный механизм Layout-ов чем не угодил?


Название: Мерцание
Отправлено: SABROG от Май 05, 2007, 11:20
Держи http://qt.osdn.org.ua/flicker-free.html


Название: Мерцание
Отправлено: pakulo от Май 05, 2007, 11:35
Цитата: "Tonal"
А стандартный механизм Layout-ов чем не угодил?

В данном случае не подходит, так как я изменяю размеры своего виджета специальным образом.

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

 
Цитата: "SABROG"
Держи http://qt.osdn.org.ua/flicker-free.html

Да, как я уже писал... читал эту статью... но не пойму как ее применить в моем случае, я с QT знаком всего пару дней...

Может кто подскажет?

Просто в функции paintEvent, я сначала рисую свой виджет, а потом вызываю на отрисовку основной виджент  QWidget::paintEvent(event); ...

Хотя если сделать наоборот, всеравно мерцает.


Название: Мерцание
Отправлено: SABROG от Май 05, 2007, 12:41
Цитата: "pakulo"
Да, как я уже писал... читал эту статью... но не пойму как ее применить в моем случае, я с QT знаком всего пару дней...


Ну что ты читал именно эту статью ты не писал... Кто тебя знает где ты еще читал про двойную буфферизацию. Всмысле не знаешь как применить ? Там же код даже есть:

Код:

    void MyWidget::paintEvent(QPaintEvent *evt)
    {
        // any initialization
        QPainter painter(this);
        QRegion unpainted(evt->clipRegion());
        static QPixmap *doubleBuffer = 0;
        if (!doubleBuffer)
            doubleBuffer = new QPixmap;
        QPainter dbPainter(doubleBuffer);

for (int i = 0; i < lines.count(); i++) {
            Line *line = lines[i];
            doubleBuffer->resize(QMAX(doubleBuffer->width(),
 line->boundingRect().width()),
QMAX(doubleBuffer->height(), line->boundingRect().height()));
            doubleBuffer->fill(backgroundColor);
            line->draw(&dbPainter);
            painter.drawPixmap(0, line->boundingRect().y(), *doubleBuffer, 0,
 0,
                               line->boundingRect().width(),
 line->boundingRect().height());
            unpainted -= line->boundingRect();
        }
        painter.setClipRegion(unpainted);
        painter.fillRect(unpainted.boundingRect(), backgroundColor);
    }


Что мешает адаптировать его под твой paintEvent ?

При обновлении основного виджета - все дочерние обновляются автоматически.

Кстати вот еще насчет двойной буфферизации:
Цитировать

From Qt 4.0, QWidget automatically double-buffers its painting, so there's no need to write double-buffering code in paintEvent() to avoid flicker.


Название: Мерцание
Отправлено: pakulo от Май 05, 2007, 13:45
Не могу понять, как его применить, если я ничего сам не рисую. Все рисует QT.
Попробую объяснить что нужно...

У меня есть виджет (взял стандартный), добавил на него еще пару виджетов (тоже стандартный). Мне нужно когда изменяется первый виджет, изменить положение внутренних виджетов.
Я это сделал так как написав выше. Т.е. переопределил paintEvent, в котором вызываю функцию изменяющую позицию подчиненных виджетов в зависимости от новых размером, потом вызываю стандартную функцию прористовки виджета QWidget::paintEvent(event);
Как мне тут применить двойную буферизацию или может как-то по-другому сделать можно? что бы не мерцало.


Название: Мерцание
Отправлено: Gryz от Май 07, 2007, 10:56
тебе paintEvent тут совершенно не нужен! Его нужно использовать, только когда что-то отрисовать надо.
Используй событие geometryChanged или что-то типа того! (на этом компе qt нет, не могу точно посмотреть).


Название: Мерцание
Отправлено: pakulo от Май 07, 2007, 13:46
Gryz, спасибо большое, я уже так и сделал!


Название: Мерцание
Отправлено: Muller от Май 07, 2007, 13:47
Цитата: "pakulo"
Цитата: "Tonal"
А стандартный механизм Layout-ов чем не угодил?

В данном случае не подходит, так как я изменяю размеры своего виджета специальным образом.

А что мешает создать свой Layout, породив его от QLayout? См. пример customlayout.