Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Мерцание при отрисовке 
:(
    Опции темы
Mephisto
Дата 14.9.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



Есть некоторый Widget, на нем пытаюсь отрисовать некоторый Image по таймеру. Невооруженным взглядом заметно мерцание.
Собственно сама канва с картинкой:
Код

#ifndef GPLOTTER_H
#define GPLOTTER_H

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTimerEvent>

class GImage : public QImage
{
public:
    GImage(int width = 640, int height = 480, Format format = QImage::Format_ARGB32_Premultiplied);

    ~GImage();


    void drawGImage();

};

class GPlotter : public QWidget
{

public:

    GPlotter(QWidget *parent = 0);

protected:

    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);

private:

    GImage im; // собственно буфер для отрисовки
    QPixmap *doubleBuffer;
    QColor clr;
};

#endif // GPLOTTER_H


Реализация:
Код

#include "GPlotter.h"
#include <qpixmap.h>

GImage::GImage(int width, int height, Format format)
    :QImage(width, height, format)
{

}

GImage::~GImage()
{

}

void GImage::drawGImage()
{
    uchar *ch = bits();
// передвигаю картинку вверх на строку
    for (int i = 0; i < height()-1; ++i)
        for (int j = 0; j < width(); ++j)
            ((int*)ch)[i * width() + j] = ((int*)ch)[(i+1)*width()+j];

// добавляю новую строку
    for (int i = 0; i < width(); ++i)
        if (qrand()%3 != 0)
            ((int*)ch)[(height()-1) * width() + i] = (int) qRgb(0,0,255);
        else
                ((int*)ch)[(height()-1) * width() + i] = (int) qRgb(255,255,0);
}

GPlotter::GPlotter(QWidget *parent)
    :QWidget(parent)
{
    setFixedSize(im.width(), im.height());
    startTimer(100);

    setAttribute(Qt::WA_OpaquePaintEvent, true);
    setAttribute(Qt::WA_NoSystemBackground, true);

    doubleBuffer = new QPixmap(im.width(), im.height());
}

void GPlotter::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPainter dbPainter(doubleBuffer);

    doubleBuffer->fill(clr.black());

    dbPainter.drawImage(0, 0, im);

    painter.drawPixmap(0, 0, *doubleBuffer, 0, 0, im.width(), im.height());
}

void GPlotter::timerEvent(QTimerEvent *event)
{
    im.drawGImage();
    update();
}


З.Ы. пример не мой, я ради споривного интереса. Сам побороть не смог. smile 

Ниже прикрепляю исходники.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Test.zip 1,74 Kb
PM   Вверх
kamre
Дата 16.9.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(Mephisto @ 14.9.2010,  18:45)
Невооруженным взглядом заметно мерцание.

А мерцания нету smile  Попробуйте заменить qrand() на i:

Код

        if (i%3 != 0)
            ((int*)ch)[(height()-1) * width() + i] = (int) qRgb(0,0,255);
        else
            ((int*)ch)[(height()-1) * width() + i] = (int) qRgb(255,255,0);


P.S. ну или на ЭЛТ мониторе посмотрите исходную картинку.

Это сообщение отредактировал(а) kamre - 16.9.2010, 12:08
PM MAIL   Вверх
Mephisto
Дата 16.9.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



Цитата(kamre @  16.9.2010,  13:06 Найти цитируемый пост)
А мерцания нету

Ты гипнотизер?  smile У меня тоже не мерцает. Правда собираю сейчас под линухом и на ноуте. А на работе стоит виста.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.