2017-12-02 248 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)); 

添加像素圖的資源文件,你會得到你的撥號裏面一個完美的調整大小,旋轉圖像

相關問題