以下是一个基本的旋转开关,使用Qt的QPainter和QWidget绘制:
#include <QWidget>
#include <QPainter>
class RotatingSwitch : public QWidget {
public:
RotatingSwitch(QWidget *parent = 0) : QWidget(parent) {
setFixedSize(50, 50);
m_rotation = 0;
}
protected:
void paintEvent(QPaintEvent *) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制底部圆形
QRectF baseRect(5, 5, width()-10, height()-10);
painter.setBrush(Qt::gray);
painter.drawEllipse(baseRect);
// 绘制旋转按钮
QRectF buttonRect(15, 15, width()-30, height()-30);
painter.save();
painter.translate(width()/2.0, height()/2.0); // 将原点移至中心点
painter.rotate(m_rotation); // 根据当前旋转角度进行旋转
painter.translate(-width()/2.0, -height()/2.0); // 将原点移回左上角
QPen pen(Qt::black, 3);
pen.setCapStyle(Qt::RoundCap);
painter.setPen(pen);
painter.drawLine(width()/2.0, height()/2.0,
width()/2.0 + (buttonRect.width() / 2.0), height()/2.0);
// 还原画笔状态并绘制按钮矩形
painter.restore();
painter.setBrush(Qt::white);
painter.drawRect(buttonRect);
}
void mousePressEvent(QMouseEvent *) override {
m_startPos = mapFromGlobal(QCursor::pos());
}
void mouseMoveEvent(QMouseEvent *event) override {
QPoint newPos = event->globalPos();
QPoint delta = newPos - m_startPos;
m_rotation += delta.y(); // 根据鼠标移动距离更新旋转角度
m_startPos = newPos;
update(); // 重新绘制控件
}
private:
int m_rotation;
QPoint m_startPos;
};
使用方式:
RotatingSwitch *switchControl = new RotatingSwitch(parentWidget);
switchControl->show();