qt 图片旋转角度的有关问题
qt 图片旋转角度的问题
有如下需求:
一个图片(表盘的指针之类的,美工已经画好的png图片),需要摆放在一个QVBoxLayout里面,
并且随着传入角度参数不同而变化。这个该怎么实现?
在线等 谢谢啊。
------解决思路----------------------
图片画在QWidget上,画的时候根据要旋转的角度用QPainter::rotate()先旋转后绘制。
------解决思路----------------------
QMatrix leftmatrix;
leftmatrix.rotate(90);
leftArrowLabel = new QLabel();
leftArrowLabel->setPixmap(QPixmap(":/images/arrowhead.png").transformed(leftmatrix,Qt::SmoothTransformation));
把图片向右旋转90度,画在leftArrowLabel 上,其他角度你自己旋转就好了。我们项目里边就是这么用的。
------解决思路----------------------
这个label直接new出来然后加入layout就可以了
效果就是下图,不过下图是外面的圈圈转,里面的字不转,你只要稍微改下就可以了
------解决思路----------------------
默认就是中间,你试试就知道了
有如下需求:
一个图片(表盘的指针之类的,美工已经画好的png图片),需要摆放在一个QVBoxLayout里面,
并且随着传入角度参数不同而变化。这个该怎么实现?
在线等 谢谢啊。
------解决思路----------------------
图片画在QWidget上,画的时候根据要旋转的角度用QPainter::rotate()先旋转后绘制。
------解决思路----------------------
QMatrix leftmatrix;
leftmatrix.rotate(90);
leftArrowLabel = new QLabel();
leftArrowLabel->setPixmap(QPixmap(":/images/arrowhead.png").transformed(leftmatrix,Qt::SmoothTransformation));
把图片向右旋转90度,画在leftArrowLabel 上,其他角度你自己旋转就好了。我们项目里边就是这么用的。
------解决思路----------------------
#ifndef CYCLOPROGRESS_H
#define CYCLOPROGRESS_H
#include <QLabel>
#include <QPixmap>
class CycloProgress : public QLabel
{
Q_OBJECT
public:
explicit CycloProgress(QWidget *parent = 0);
void setMinLoops(int loops = 3);
/**
* @brief startAnimation start the Animation
* @param interval unit is milliseconds
*/
void startAnimation(int interval = 25);
void stopAnimation();
signals:
void runMinLoopsEnough();
protected:
void paintEvent(QPaintEvent *);
void timerEvent(QTimerEvent *event);
private:
int timerID;
int minLoops;
QPixmap m_pixmap;
qreal m_rotation;
};
#endif // CYCLOPROGRESS_H
#include "cycloprogress.h"
#include <QPainter>
#include <QTimerEvent>
#include <QDebug>
CycloProgress::CycloProgress(QWidget *parent) :
QLabel(parent), minLoops(3)
{
m_rotation = 0.0;
timerID = 0;
m_pixmap = QPixmap("://qrc/cyclo.png");
}
void CycloProgress::setMinLoops(int loops)
{
minLoops = loops;
}
void CycloProgress::startAnimation(int interval)
{
if(timerID == 0){
timerID = startTimer(interval);
}
}
void CycloProgress::stopAnimation()
{
killTimer(timerID);
timerID = 0;
}
void CycloProgress::timerEvent(QTimerEvent * event)
{
if(event->timerId() == timerID){
m_rotation += 5;
update();
if(m_rotation > minLoops*360){
emit runMinLoopsEnough();
}
}
}
void CycloProgress::paintEvent(QPaintEvent * /*event*/)
{
QPainter painter(this);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.setRenderHint(QPainter::Antialiasing);
QPixmap leadon_text("://qrc/leadon_e_char.png");
QPointF center(m_pixmap.width() / qreal(2), m_pixmap.height() / qreal(2));
painter.drawPixmap(m_pixmap.width() / qreal(2) -leadon_text.width() / 2 , m_pixmap.height() / qreal(2), leadon_text);
painter.translate(center);
painter.rotate(m_rotation);
painter.translate(-center);
painter.drawPixmap(QPointF(0, 0), m_pixmap);
}
这个label直接new出来然后加入layout就可以了
效果就是下图,不过下图是外面的圈圈转,里面的字不转,你只要稍微改下就可以了
------解决思路----------------------
默认就是中间,你试试就知道了