首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不更改大小的情况下旋转QPixmap

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

Stack Overflow用户
提问于 2017-12-03 04:13:59
回答 2查看 4.6K关注 0票数 0

如何在不改变大小的情况下旋转QPixmap我使用了这个代码,但是当我旋转图像时,它改变了图像的大小。

头文件

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
#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我使用此代码,但当我旋转图像时,它会更改图像的大小

EN

回答 2

Stack Overflow用户

发布于 2017-12-04 00:11:56

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

代码语言:javascript
复制
//load pixmap
QPixmap pix(":/images/pixmap.png");
//rotate pixmap
QMatrix rm;
rm.rotate(a);
int pxw = pix.width(), pxh = pix.height();
pix = pix.transformed(rm);
pix = pix.copy((pix.width() - pxw)/2, (pix.height() - pxh)/2, pxw, pxh);

但这将是低效的(另请参阅QPixmap::transformed()的注释)。我更喜欢使用QPainter直接绘制,而不是创建中间像素图,特别是因为你已经有了它:

代码语言:javascript
复制
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(-pix.rect().center(), pix);

还要考虑在小部件初始化时加载QPixmap并将其存储,而不是在paintEvent中进行加载(同样是为了提高效率)。

QPixmap::transformed()在旋转时增加大小的原因是为了获得包括边缘在内的整个图像,因为您总是可以从较大的图像中提取较小的图像,但反之亦然。你可能有一张圆形的图片,但对于矩形图片,这是显而易见的。

票数 1
EN

Stack Overflow用户

发布于 2017-12-04 15:11:04

Qdial用来计算背景圆的方法如下

代码语言:javascript
复制
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是背景圆的矩形。然后,只需使用这些坐标添加Pixmap资源文件

代码语言:javascript
复制
 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));

在你的表盘里你会得到一个完美的可调整大小和旋转的图像

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47612117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档