2017-12-02 250 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は、ファイルIこのコードを使用するが、私は、画像を回転させるときに画像のサイズを変更するサイズを変更することなく、QPixmapのを回転させる方法

#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)); 
} 

ヘッダファイル

+0

それら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)); 

を使用してピックスマップリソースファイルを追加すると、ダイヤルの内側に完璧なサイズ変更が可能と回転可能な画像を取得しますそしてあなたが得たいもの。 – 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); 

また、効率のために、再び(paintEventでそれをやっていることを、あなたのウィジェットの初期化にQPixmapのをロードし、むしろそれを格納考えます)。

QPixmap :: transformed()が回転するとサイズが大きくなる理由は、常に大きな画像から小さな画像を取り出すことができるため、エッジを含む画像全体を取得することです。あなたはおそらく丸い画像を持っていますが、長方形の場合はすぐに明らかです。

0

Qdial背景円を計算するために使用される方法は、それでQRect br背景円用矩形であるこの

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)); 

あります。それからちょうどあなたがより良い自分自身を説明し、何を意味するか、あなたは何を得るの画像を置くことができ