LINUX.ORG.RU

qt + QPainter.rotate()


0

0

Есть функция, назначение которой вертеть картинку: void AnimatedControlPanel::rotatePixmap(int theRotationInt) { QPainter painter; QPixmap strelka; // local copy strelka = strelka1; QPointF center(strelka.width() / qreal(2), strelka.height() / qreal(2)); painter.begin(&strelka); painter.save(); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.translate(center); painter.rotate(theRotationInt); painter.translate(-center); painter.drawPixmap(QPointF(0, 0), strelka); painter.setPen(QPen(QColor(255, 0, 0, alpha), 0.25, Qt::SolidLine, Qt::FlatCap, Qt::BevelJoin)); painter.setBrush(Qt::NoBrush); painter.drawRect(QRectF(0, 0, strelka.width(), strelka.height()).adjusted(-2, -2, 2, 2)); painter.restore(); painter.end(); ui.strelka_Label -> setPixmap(strelka); }

Проблема в том, что при отрисовке всегда на заднем плане рисуется исходная картинка и потом поверх нее уже повернутая. Не понимаю, почему так происходит. Может где явная ошибка?

Еще раз тоже самое, но с переносами :)

void AnimatedControlPanel::rotatePixmap(int theRotationInt)
{
QPainter painter;
QPixmap strelka; // local copy
strelka = strelka1;
QPointF center(strelka.width() / qreal(2), strelka.height() / qreal(2));
painter.begin(&strelka);
painter.save();
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.translate(center);
painter.rotate(theRotationInt);
painter.translate(-center);
painter.drawPixmap(QPointF(0, 0), strelka);
painter.setPen(QPen(QColor(255, 0, 0, alpha), 0.25, Qt::SolidLine, Qt::FlatCap, Qt::BevelJoin));
painter.setBrush(Qt::NoBrush);
painter.drawRect(QRectF(0, 0, strelka.width(), strelka.height()).adjusted(-2, -2, 2, 2));
painter.restore();
painter.end();
ui.strelka_Label -> setPixmap(strelka);
}

lisarden
() автор топика
Ответ на: комментарий от teferiincub

> setAutoFillBackground(true)
Я это сейчас попробую, но в окне еще картинок 20, у них прозрачность отрисовывается. А когда крутить начинаю, то и эта стрелка тоже с прозрачностью, всё в порядке. Только на заднем плане, эта же стрелка, но с углом поворота нуль.

lisarden
() автор топика
Ответ на: комментарий от lisarden

> strelka = strelka1;

Это создание копии пиксмапа strelka1, то-есть последующее рисование происходит поверх того что было в strelka1. Да, рекомендую взять в привычку бить себя по пальцам за такие названия переменных.

> painter.drawPixmap(QPointF(0, 0), strelka);


А этот пункт мне вообще непонятен, вы пытаетесь рисовать картинку на самой себе?

Dendy ★★★★★
()
Ответ на: комментарий от lisarden

возможно перед перерисовкой изображения, painter нужно очистить.

>void QPainter::eraseRect ( const QRectF & rectangle )

QRectF - соответственно размер и координаты твоей картинки.

andreykyz ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.