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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мерцание  (Прочитано 5609 раз)
pakulo
Гость
« : Май 05, 2007, 02:17 »

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

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

Спасибо!

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

 да, забыл...
мерцает и мой виджет и основной...
Записан
Tonal
Гость
« Ответ #1 : Май 05, 2007, 08:16 »

А стандартный механизм Layout-ов чем не угодил?
Записан
SABROG
Гость
« Ответ #2 : Май 05, 2007, 11:20 »

Держи http://qt.osdn.org.ua/flicker-free.html
Записан
pakulo
Гость
« Ответ #3 : Май 05, 2007, 11:35 »

Цитата: "Tonal"
А стандартный механизм Layout-ов чем не угодил?

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

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

 
Цитата: "SABROG"

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

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

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

Хотя если сделать наоборот, всеравно мерцает.
Записан
SABROG
Гость
« Ответ #4 : Май 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
Гость
« Ответ #5 : Май 05, 2007, 13:45 »

Не могу понять, как его применить, если я ничего сам не рисую. Все рисует QT.
Попробую объяснить что нужно...

У меня есть виджет (взял стандартный), добавил на него еще пару виджетов (тоже стандартный). Мне нужно когда изменяется первый виджет, изменить положение внутренних виджетов.
Я это сделал так как написав выше. Т.е. переопределил paintEvent, в котором вызываю функцию изменяющую позицию подчиненных виджетов в зависимости от новых размером, потом вызываю стандартную функцию прористовки виджета QWidget::paintEvent(event);
Как мне тут применить двойную буферизацию или может как-то по-другому сделать можно? что бы не мерцало.
Записан
Gryz
Гость
« Ответ #6 : Май 07, 2007, 10:56 »

тебе paintEvent тут совершенно не нужен! Его нужно использовать, только когда что-то отрисовать надо.
Используй событие geometryChanged или что-то типа того! (на этом компе qt нет, не могу точно посмотреть).
Записан
pakulo
Гость
« Ответ #7 : Май 07, 2007, 13:46 »

Gryz, спасибо большое, я уже так и сделал!
Записан
Muller
Гость
« Ответ #8 : Май 07, 2007, 13:47 »

Цитата: "pakulo"
Цитата: "Tonal"
А стандартный механизм Layout-ов чем не угодил?

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

А что мешает создать свой Layout, породив его от QLayout? См. пример customlayout.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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