如何在不改变大小的情况下旋转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