下面是一个简单的示例程序,演示如何在Qt中实现一个角度开关:
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
class AngleSwitch : public QWidget {
public:
AngleSwitch(QWidget *parent = nullptr) : QWidget(parent), m_angle(0) {
setFixedSize(50, 50);
}
void paintEvent(QPaintEvent *) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制圆形背景
painter.setBrush(m_on ? QColor("#77DD77") : QColor("#DCDCDC"));
painter.drawEllipse(rect());
// 绘制三角形指针
painter.translate(width() / 2, height() / 2);
painter.rotate(m_angle);
QPolygonF arrow;
arrow << QPointF(-10, 0) << QPointF(10, 0) << QPointF(0, -20);
painter.drawPolygon(arrow);
}
void mousePressEvent(QMouseEvent *) override {
m_on = !m_on;
update();
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
QPoint pos = event->pos() - rect().center();
int angle = qRound(qRadiansToDegrees(std::atan2(-pos.y(), pos.x())));
if (angle < 0)
angle += 360;
m_angle = angle;
update();
}
}
private:
bool m_on{false};
int m_angle{0};
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AngleSwitch switcher;
switcher.show();
return app.exec();
}
该程序创建了一个名为AngleSwitch
的自定义小部件,用于显示一个圆形开关和一个可旋转的三角形指针。用户可以通过鼠标拖动指针来改变其角度,并单击开关以切换其状态。
在paintEvent()
函数中,我们首先绘制背景圆形。如果开关打开,则使用绿色填充;否则使用灰色填充。然后我们将画笔移至部件中心并旋转到当前角度,最后绘制三角形指针。
在mousePressEvent()
函数中,我们简单地切换开关状态,并调用update()
函数以重绘小部件。
在mouseMoveEvent()
函数中,我们计算当前鼠标位置相对于小部件中心的偏移量,并将其转换为极坐标表示法。然后我们更新当前角度,并再次调用update()
函数以重新绘制小部件。
运行该程序时,您应该能够看到一个带有可拖动三角形指针的圆形开关。当您单击它时,它应该会从灰色变成绿色(或反之亦然),并且当您拖动指针时,圆周上的白点应跟随您的鼠标移动。