Как вращать секундную стрелку часов с помощью Qt

0

Я использую приведенный ниже код, чтобы попытаться повернуть указатель, имитирующий секундную стрелку часов, но когда он поворачивает его порезы, квадрат фона фиксирован и кажется, что я не могу повернуть все:

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

Указатель выглядит так:

Изображение 174551 Теперь с ним повернуто на 90 ° Изображение 174551

  • 0
    На первом изображении показан весь указатель без применения поворота, а на втором изображении показан только небольшой фрагмент указателя, который был после применения поворота. Такое впечатление, что он берет только одну часть указателя, когда он вращается одинаково.
Теги:
clock
qt
qpixmap
qpainter

1 ответ

0
Лучший ответ

Пример аналоговых часов Qt:

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

Надеюсь, это поможет.

  • 0
    В моем случае я уже спроектировал часы, просто нужно выяснить, как крутить стрелки, тогда этот пример тут не сильно поможет.
  • 0
    Указатель вращается, но он не остается в центре, поскольку он вращается, он меняет положение. Где ему глупо оставаться с одной из неподвижных точек и при этом вращаться по кругу? Спасибо за Ваше внимание.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню