Как вращать секундную стрелку часов с помощью Qt
Я использую приведенный ниже код, чтобы попытаться повернуть указатель, имитирующий секундную стрелку часов, но когда он поворачивает его, он обрезается, квадрат фона фиксируется и кажется, что я не могу повернуть все:
QPixmap shipPixels(":/new/prefix1/imagem/ponteiro.png");
QPixmap rotatePixmap(shipPixels.size());
rotatePixmap.fill(Qt::transparent);
QPainter p(&rotatePixmap);
p.translate(rotatePixmap.size().width() / 2, rotatePixmap.size().height() / 2);
p.rotate(90);
p.translate(-rotatePixmap.size().width() / 2, -rotatePixmap.size().height() / 2);
p.drawPixmap(0, 0, shipPixels);
p.end();
shipPixels = rotatePixmap;
ui->label->setPixmap(rotatePixmap);
Указатель выглядит так:
Теперь с ним вращается на 90 º
1 ответ
Решение
Пример Qt Analog Clock:
http://qt-project.org/doc/qt-5/qtwidgets-widgets-analogclock-example.html
Может быть, прежде чем вращаться QPixmap
s, попробуйте нарисовать линию. После того, как линия на месте и рисунок правильно работает, оттуда в обратном направлении.
ОБНОВИТЬ:
Пример кода для поворота изображений.
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPaintEvent>
#include <QPixmap>
#include <QTime>
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
signals:
public slots:
void paintEvent(QPaintEvent *);
private:
QPixmap bg;
QPixmap second_hand;
QTime time;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QPainter>
#include <QTimer>
#include <QTime>
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
time.restart();
this->resize(256, 256);
// both images are 256x256 in this example
bg.load("./images/bg.png");
second_hand.load("./images/second_hand.png");
QTimer * t = new QTimer;
t->setSingleShot(false);
t->setInterval(15);
QObject::connect(t,SIGNAL(timeout()), this, SLOT(update()));
t->start();
}
void Widget::paintEvent(QPaintEvent * e)
{
QPainter p(this);
p.drawPixmap(QPoint(0,0),bg);
qreal seconds = ((qreal)(time.elapsed() % 60000))/1000;
p.translate(this->width()/2, this->height()/2);
p.rotate(seconds/60*360);
p.drawPixmap(QPoint(-this->width()/2, -this->height()/2),second_hand);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Надеюсь, это поможет.