当前位置: 首页 > article >正文

Qt 实现会转动风扇效果

要在Qt中实现一个带有转动风扇效果,可以按照以下步骤进行:

1. 创建一个自定义按钮类

继承QPushButton,并在其中添加绘制风扇动画的功能。

#include <QtWidgets/QPushButton>
#include <QtWidgets/QLabel>
#include <QtCore/QTimer>
#include <QtGui/QPainter>
#include <QtGui/QPaintEvent>

class AnimatedFanButton : public QPushButton {
public:
    AnimatedFanButton(const QString &text, QWidget *parent = nullptr)
        : QPushButton(text, parent) {
        // 初始化风扇旋转角度
        rotationAngle = 0;
        // 创建一个定时器,用于更新旋转角度
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &AnimatedFanButton::updateRotation);
        timer->start(50); // 每50毫秒更新一次
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        QPushButton::paintEvent(event);
        // 在按钮上绘制风扇
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿

        // 设置绘制中心点
        int radius = qMin(width(), height()) / 3;
        int centerX = width() / 2;
        int centerY = height() / 2;

        // 绘制风扇叶片
        QPen pen(Qt::black, 3);
        painter.setPen(pen);
        painter.translate(centerX, centerY); // 平移到中心点
        painter.rotate(rotationAngle); // 应用旋转角度

        // 绘制三个叶片
        for (int i = 0; i < 3; ++i) {
            painter.drawLine(0, -radius, 0, radius/2);
            painter.rotate(120); // 每次旋转120度
        }

        painter.end();
    }

private slots:
    void updateRotation() {
        rotationAngle += 3; // 每次旋转3度
        if (rotationAngle >= 360) {
            rotationAngle -= 360;
        }
        update(); // 刷新界面
    }

private:
    int rotationAngle;
};

2 创建主窗口并添加按钮

在主窗口中创建并显示带有转动风扇的按钮。

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.resize(400, 400);
    window.setStyleSheet("background-color: #f0f0f0;");

    AnimatedFanButton button("Click Me!", &window);
    button.setGeometry(100, 100, 100, 100);
    button.show();

    return app.exec();
}

3 另外如果你想实现拖动功能

在自定义按钮类中添加鼠标事件处理,使按钮可以被拖动。

class AnimatedFanButton : public QPushButton {
    // ... 其他代码保持不变 ...

protected:
    void mousePressEvent(QMouseEvent *event) override {
        QPushButton::mousePressEvent(event);
        if (event->button() == Qt::LeftButton) {
            dragStartPos = event->globalPos();
            buttonPos = pos();
        }
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        if (event->buttons() & Qt::LeftButton) {
            QPoint delta = event->globalPos() - dragStartPos;
            move(buttonPos + delta);
            event->accept();
        }
    }

    void mouseReleaseEvent(QMouseEvent *event) override {
        QPushButton::mouseReleaseEvent(event);
        // 拖动结束时重置变量
        dragStartPos = QPoint();
        buttonPos = QPoint();
    }

private:
    QPoint dragStartPos;
    QPoint buttonPos;
};

4. 运行程序

编译并运行程序,你将看到一个带有旋转风扇的悬浮按钮,可以点击并拖动到任意位置。


http://www.kler.cn/a/577051.html

相关文章:

  • 探秘 C 语言:编程世界的基石与传奇
  • 【统计至简】【入门测试1】给定数据矩阵X,如何求其质心、中心化数据、标准化数据、格拉姆矩阵、协方差矩阵、相关系数矩阵
  • 在Windows系统上安装和配置Redis服务
  • [c语言日寄]结构体:内存对齐
  • 【贪心算法1】
  • OkHttp 连接池模块原理深度剖析
  • 软考高项笔记 1.1.1 信息
  • 详解常用集合和映射中的线程安全问题
  • 元组(Tuple)详解——c#
  • Android Studio 创建项目同步失败
  • Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)
  • 三、零基础学习TypeScript——JavaScript和TypeScript数据类型区别
  • [Lc6_模拟] 替换所有的问号 | 提莫攻击 | Z 字形变换 | 外观数列
  • Django在处理模型录入时间差8小时的问题
  • Python3 爬虫 爬虫中间件
  • 数据结构链式表
  • CEF在MFC上的示例工程
  • 国产编辑器EverEdit - 宏功能介绍
  • VPS加装前置代理全解析
  • Manus AI探索