QT开发中文网

qt实现角度开关

下面是一个简单的示例程序,演示如何在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()函数以重新绘制小部件。

运行该程序时,您应该能够看到一个带有可拖动三角形指针的圆形开关。当您单击它时,它应该会从灰色变成绿色(或反之亦然),并且当您拖动指针时,圆周上的白点应跟随您的鼠标移动。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2110

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?