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