如何在不改变大小的情况下旋转QPixmap

如何旋转QPixmap而不更改大小 我使用此代码,但当旋转图像时,它会更改图像的大小。如何在不改变大小的情况下旋转QPixmap

头文件

#ifndef CUSTOMDIAL_H 

#define CUSTOMDIAL_H

#include <QDial>

class CustomDial : public QDial

{

Q_OBJECT

public:

CustomDial(QWidget * parent = nullptr);

private:

virtual void paintEvent(QPaintEvent*) override;

};

#endif

cpp文件

#include "Customdial.h" 

#include <QGraphicsPixmapItem>

#include <QPainter>

#include <QColor>

#include <QPixmap>

CustomDial::CustomDial(QWidget* parent)

: QDial(parent)

{

// Default range

QDial::setRange(0,100);

}

void CustomDial::paintEvent(QPaintEvent*)

{

int a = QDial::sliderPosition();

QPainter painter(this);

//load pixmap

QPixmap pix(":/img/img/knob.png");

//rotate pixmap

QMatrix rm;

rm.rotate(a);

pix = pix.transformed(rm);

//draw pixmap

painter.drawPixmap(QPointF(0,0),

pix.scaled(QDial::height(),

QDial::height(),

Qt::KeepAspectRatio),

pix.rect().adjusted(1, 1, -1000, -1000));

}

如何旋转,在不改变大小我用这个代码,但是当我将图像旋转它改变图像的大小的QPixmap头文件

回答:

关于你的问题,你可以使用QPixmap :: copy()来提取所需大小的中心部分:

//load pixmap 

QPixmap pix(":/img/img/knob.png");

//rotate pixmap

QMatrix rm;

rm.rotate(a);

int pxw = pixmap.width(), pxh = pixmap.height();

pix = pix.transformed(rm);

pix = pix.copy((pix.width() - pxw)/2, (pix.height() - pxh)/2, pxw, pxh);

但这样做效率不高(另请参阅QPixmap::transformed()的说明)。我宁愿绘图直接使用QPainter不需要另外建立中介像素图,因为你已经拥有了它:

qreal scale = qMin(width(), height())/qMax(pix.width(), pix.height()); 

QPointF center(width()/2., height()/2.); // widget center

// uncomment to trade performance for quality

// painter.setRenderHint(QPainter::SmoothPixmapTransform);

painter.translate(center);

painter.rotate(degrees);

painter.scale(scale, scale);

painter.drawPixmap(-center, pixmap);

还要考虑负载的QPixmap上小部件的初始化和保存它,而在的paintEvent做(再次求效率)。

QPixmap :: transformed()增加旋转大小的原因是为了获得包含边缘的整个图像,因为您始终可以从较大的图像中提取较小的图像,但反之亦然。你可能有一个圆形的图片,但对于矩形,它很明显。

回答:

的方法,该Qdial使用以计算背景圆是本

int width = option.rect.width(); 

int height = option.rect.height();

qreal r2 = qMin(width, height)/2;

r2 -= r2/50;

const qreal d_ = r2/6;

const qreal dx = option.rect.x() + d_ + (width - 2 * r2)/2 + 1;

const qreal dy = option.rect.y() + d_ + (height - 2 * r2)/2 + 1;

QRectF br = QRectF(dx + 0.5, dy + 0.5,

int(r2 * 2 - 2 * d_ - 2),

int(r2 * 2 - 2 * d_ - 2));

所以QRect br为背景圆的矩形。然后,只需使用这些cordinates

int w=option.rect.width()/2; 

int h=option.rect.height()/2;

painter.translate(w,h);

painter.rotate(a);

//draw pixmap

painter.drawPixmap(-br.width()/2,

-br.height()/2,

pix.scaled(br.width(),br.height(),Qt::KeepAspectRatio));

添加像素图的资源文件,你会得到你的拨号里面一个完美的调整大小,旋转图像

以上是 如何在不改变大小的情况下旋转QPixmap 的全部内容, 来源链接: utcz.com/qa/258135.html

回到顶部