旋转的沙漏-[ Qt绘制旋转图像]

简介: 旋转的沙漏-[ Qt绘制旋转图像]

参考

[解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1] 需要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() ,所以本项目 需要使用自定义的MyQLabel继承QLabel]( https://blog.csdn.net/qq_47355554/article/details/129235300)

正点原子案例

最近毕业设计需要用到旋转的沙漏,记忆中好像在正点原子学过

spin.cpp

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    spin.cpp

HEADERS += \
    spin.h

FORMS +=

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    res.qrc

main.cpp

#include "spin.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SPIN w;
    w.show();
    return a.exec();
}

spin.h

#ifndef SPIN_H
#define SPIN_H

#include <QWidget>
#include <QTimer>
#include <QPainter>

class SPIN : public QWidget
{
    Q_OBJECT
public:
    explicit SPIN(QWidget *parent = nullptr);


protected:
    void paintEvent(QPaintEvent *); /* 重写父类下的 paintEvent方法*/

private:
    /* 定时器,用于定时更新界面 */
    QTimer *timer;
    /* 角度 */
    int angle;
private slots:
    void timerTimeOut();
};

#endif // SPIN_H

spin.cpp

#include "spin.h"

SPIN::SPIN(QWidget *parent)
    : QWidget{parent}
{
    /* 设置主窗口位置及颜色 */
    this->setGeometry(0, 0, 1024, 600);
    setPalette(QPalette(Qt::gray));
    setAutoFillBackground(true);

    /* 定时器实例化 */
    timer = new QTimer(this);

    /* 默认角度为 0 */
    angle = 0;

    /* 定时 100ms */
    timer->start(100);

    /* 信号槽连接 */
    connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
}

/* 重写父类下的 paintEvent方法*/
void SPIN::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e)

    /* 指定父对象,this 指本窗口 */
    QPainter painter(this);

    /* 设置抗锯齿,流畅转换 */
    painter.setRenderHints(QPainter::Antialiasing
                           | QPainter::SmoothPixmapTransform);
    /* 计算旋转角度 */
    if (angle++ == 360)
        angle = 0;

    /* QPixmap 类型对象 */
    QPixmap image;

    /* 加载 */
    image.load(":/spin.webp");
    image=image.scaled(image.size() / 2); // 缩放为原大小的一半

    /* QRectF 即,继承 QRect(Qt 的矩形类),F 代表精确到浮点类型 */
    QRectF rect((this->width() - image.width()) / 2-200,
                (this->height() - image.height()) / 2,
                image.width(),
                image.height());

    /* 默认参考点为左上角原点(0,0),因为旋转需要以图形的中心为参考点,
         * 我们使用 translate 把参考点设置为 CD 图形的中心点坐标 */
    painter.translate(0 + rect.x() + rect.width() / 2,
                      0 + rect.y() + rect.height() / 2);

    /* 旋转角度 */
    painter.rotate(angle);

    /* 现在参考点为 CD 图形的中心,我们需要把它设置回原点的位置,
          * 所以需要减去上面加上的数 */
    painter.translate(0 - (rect.x() + rect.width() / 2),
                      0 - (rect.y() + rect.height() / 2));

    /* 画图,QPainter 提供了许多 drawX 的方法 */
    painter.drawImage(rect, image.toImage(), image.rect());

    /* 再画一个矩形 */
    painter.drawRect(rect.toRect());

    {
        /* 指定父对象,this 指本窗口 */
        QPainter painter2(this);

        /* 设置抗锯齿,流畅转换 */
        painter2.setRenderHints(QPainter::Antialiasing
                               | QPainter::SmoothPixmapTransform);
        /* 计算旋转角度 */
        if (angle++ == 360)
            angle = 0;

        /* QPixmap 类型对象 */
        QPixmap image2;

        /* 加载 */
        image2.load(":/sandClock.webp");
        image2=image2.scaled(image2.size() / 2); // 缩放为原大小的一半

        /* QRectF 即,继承 QRect(Qt 的矩形类),F 代表精确到浮点类型 */
        QRectF rect2((this->width() - image2.width()) / 2+300,
                    (this->height() - image2.height()) / 2,
                    image2.width(),
                    image2.height());

        /* 默认参考点为左上角原点(0,0),因为旋转需要以图形的中心为参考点,
             * 我们使用 translate 把参考点设置为 图形的中心点坐标 */
        painter2.translate(0 + rect2.x() + rect2.width() / 2,
                          0 + rect2.y() + rect2.height() / 2);

        /* 旋转角度 */
        painter2.rotate(-angle);

        /* 现在参考点为 CD 图形的中心,我们需要把它设置回原点的位置,
              * 所以需要减去上面加上的数 */
        painter2.translate(0 - (rect2.x() + rect2.width() / 2),
                          0 - (rect2.y() + rect2.height() / 2));

        /* 画图,QPainter 提供了许多 drawX 的方法 */
        painter2.drawImage(rect2, image2.toImage(), image2.rect());

        /* 再画一个矩形 */
        painter2.drawRect(rect2.toRect());
    }



}

void SPIN::timerTimeOut()
{
    /* 需要更新界面,不设置不更新 */
    this->update();
}

效果

image.png
image.png

相关文章
|
5月前
|
存储 Cloud Native Linux
OpenCV图像翻转和旋转
OpenCV图像翻转和旋转
|
6月前
|
计算机视觉
OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字
OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字
87 0
|
计算机视觉
OpenCV-最小包围旋转矩形边框cv::minAreaRect
OpenCV-最小包围旋转矩形边框cv::minAreaRect
179 0
|
计算机视觉
OpenCV-绘制旋转矩形
OpenCV-绘制旋转矩形
175 0
|
图形学
Unity 之 获取物体的旋转角正确数值
不管父物体如何设置,都能获取到物体本身旋转角度的正确数值
1061 0
110.绘制彩色抛物线
110.绘制彩色抛物线
102 0
Halcon示例之求一个矩形四个角点坐标的八种方法
Halcon示例之求一个矩形四个角点坐标的八种方法
1673 0
Halcon示例之求一个矩形四个角点坐标的八种方法
|
定位技术 图形学
交互式QGraphicsView(平移/缩放/旋转)
简述 Graphics View提供了一个平台,用于大量自定义 2D 图元的管理与交互,框架包括一个事件传播架构,支持场景 Scene 中的图元 Item 进行精确的双精度交互功能。Item 可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也能跟踪鼠标移动。 和 Google 地图一样,在管理大量 Item 的时候,通常需要 View 具有交互(平移/缩放/旋转)
10431 1
|
C#
【C#/WPF】Image图片的Transform变换:平移、缩放、旋转
原文:【C#/WPF】Image图片的Transform变换:平移、缩放、旋转 WPF中图像控件Image的变换属性Transform: 平移 缩放 旋转 即要想实现图片的平移、缩放、旋转,是修改它所在的Image控件的Transform变换属性。
5022 0
|
计算机视觉
opencv实现坐标旋转(教你框住小姐姐)
一、项目背景 最近在做一个人脸检测项目,需要接入百度AI的系统进行识别和检测。主要流程就是往指定的URL上post图片上去,之后接收检测结果就好了。 百度的检测结果包含这样的信息:   left - 人脸区域离左边界的距离   top - 人脸区域离上边界的距离   width - 人脸区域的宽度   height - 人脸区域的高度   ratation 人脸框相对于竖直方向的顺时针旋转角[-180, 180].  如果我想把人脸框出来,很容易想到的是以(left, top)为左上顶点,以width 为宽,height为高,画一个矩形就好了。
1857 0