Артефакты при рисовании масштабированного QImage на QWidget - PullRequest
1 голос
/ 11 сентября 2010

Мое главное окно имеет следующую функцию рисования:

void MainWindow::paintEvent(QPaintEvent*)
{
    QImage sign(50, 50, QImage::Format_ARGB32_Premultiplied);
    QPainter p(&sign);
    p.setRenderHint(QPainter::Antialiasing, true);
    p.fillRect(sign.rect(), QColor(255, 255, 255, 0));
    p.setBrush(Qt::blue);
    p.setPen(Qt::NoPen);
    p.drawEllipse(0, 0, sign.width(), sign.height());
    p.end();

    QPainter painter(this);
    painter.drawImage(rect(), sign, sign.rect());
} 

Таким образом, в основном оно рисует синий заполненный круг на QImage, а затем рисует этот QImage на виджет.Однако, когда я изменяю размер окна, я получаю странные артефакты (в верхнем левом углу).Вот как это выглядит:

оригинал: alt text

после изменения размера окна: alt text

Кто-нибудь имеет представление, почему это так?

(я работаю под Ubuntu 10.04, если это интересно)

Ответы [ 2 ]

3 голосов
/ 11 сентября 2010

Я думаю, что ваш QImage инициализируется с мусором.После его создания звоните sign.fill().Я попробовал ваш код, и артефакты присутствовали даже до изменения размера на моей машине.

Из документации Qt:

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

Создает изображение с заданной шириной, высотой и форматом.

Предупреждение: это создаст QImage с неинициализированными данными.Вызовите fill (), чтобы заполнить изображение соответствующим значением пикселя, прежде чем рисовать на нем с помощью QPainter.

1 голос
/ 11 сентября 2010

Ваше изображение прозрачное (кроме круга), и вы никогда не очищаете окно до рисования (измененного) изображения, поэтому артефакты от предыдущего размера круга / окна могут остаться.

Перед ваминарисуйте изображение в окне, добавьте следующие строки:

QPalette palette = QApplication::palette();
painter.fillRect(event->rect(), palette.color(QPalette::Window));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...