2017-12-02 246 views
0

如何旋转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头文件

+0

你是什么意思,解释自己更好的,你可以把你所得到的图像和你想要获得什么。 – eyllanesc

+0

我刚做了一个QDial的自定义类来支持添加背景图像的样式表现在我的问题是,当您使用此代码在拨号程序中旋转图像时,它会更改图像的大小,还有另一种旋转Qpixmap的方式吗? – Sonicpath

+0

显示您的代码,测试您的代码并查看它是如何修复的。 – eyllanesc

回答

0

关于你的问题,你可以使用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()增加旋转大小的原因是为了获得包含边缘的整个图像,因为您始终可以从较大的图像中提取较小的图像,但反之亦然。你可能有一个圆形的图片,但对于矩形,它很明显。

0

的方法,该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)); 

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

相关问题