智能家居触摸旋钮案例(Icon可替换)

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
#include <QVector>
#include <QRect>
#include <QSize>
#include <QPixmap>
#include <QtMath>
#include <QFont>
#include <QPen>

class IconKnob : public QWidget {
    Q_OBJECT
public:
    IconKnob(QWidget *parent = nullptr) : QWidget(parent), currentIconIndex(-1) {
        setFixedSize(200, 200);
        // 初始化图标
        for (int i = 1; i <= 6; ++i) {
            QString iconName = QString("icons/%1.png").arg(i);
            icons.push_back(QPixmap(iconName));
        }
        // 初始化图标位置
        initIconPositions();
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);

        // 外圆背景
        painter.setBrush(QColor(73, 148, 196));
        painter.drawEllipse(rect().center(), 90, 90);

        // 内圆
        painter.setBrush(QColor(73, 148, 196));
        painter.drawEllipse(rect().center(), 40, 40);

        // 荧光绿圆弧
        QPen pen(QColor(0, 255, 255), 5); // 荧光绿色,线宽5
        painter.setPen(pen);
        painter.drawArc(rect().adjusted(60, 60, -60, -60), 0, 360 * 16); // 绘制圆弧

        // "菜单"文字
        painter.setPen(Qt::black); // 文字颜色为黑色
        QFont font = painter.font();
        font.setPointSize(14); // 设置字体大小
        font.setBold(true); // 加粗
        painter.setFont(font);
        painter.drawText(rect(), Qt::AlignCenter, "菜单");

        // 绘制图标
        for (int i = 0; i < icons.size(); ++i) {
            QRect iconRect = iconPositions[i];
            QPixmap icon = i == currentIconIndex ? fixedIcon : icons[i];
            painter.drawPixmap(iconRect.topLeft(), icon.scaled(iconRect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
        }
    }

    void mousePressEvent(QMouseEvent *event) override {
        for (int i = 0; i < iconPositions.size(); ++i) {
            if (iconPositions[i].contains(event->pos())) {
                currentIconIndex = i;
                update(); // 触发重绘
                break;
            }
        }
    }

private:
    QVector<QRect> iconPositions;
    QVector<QPixmap> icons;
    QPixmap fixedIcon = QPixmap("icons/fixedIcon.png"); // 固定的图标
    int currentIconIndex;

    void initIconPositions() {
        QPoint center = rect().center();
        int radius = 65; // 图标到中心的半径
        QSize iconSize(36, 36); // 图标尺寸

        for (int i = 0; i < 6; ++i) {
            double angleRadians = i * M_PI / 3 - M_PI / 2; // 计算弧度
            int x = center.x() + radius * qCos(angleRadians) - iconSize.width() / 2;
            int y = center.y() + radius * qSin(angleRadians) - iconSize.height() / 2;
            iconPositions.append(QRect(x, y, iconSize.width(), iconSize.height()));
        }
    }
};

这段代码定义了一个名为 IconKnob 的自定义 QWidget 类,主要用于创建一个图形用户界面(GUI)组件,这个组件能够以一种直观和美观的方式展示图标,并允许用户通过点击来选择不同的图标。这种组件在多种应用程序中都有潜在的用途,例如在媒体播放器、图形设计软件或任何需要快速访问不同工具或选项的软件中。

相关推荐
山河木马1 分钟前
前端学C++可太简单了:双冒号 :: 操作符
前端·javascript·c++
乌萨奇也要立志学C++1 小时前
【C++详解】STL-list模拟实现(深度剖析list迭代器,类模板未实例化取嵌套类型问题)
c++·list
闻缺陷则喜何志丹1 小时前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
序属秋秋秋2 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
十秒耿直拆包选手10 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt
霖0012 小时前
C++学习笔记三
运维·开发语言·c++·笔记·学习·fpga开发
mit6.82412 小时前
[shad-PS4] Vulkan渲染器 | 着色器_重新编译器 | SPIR-V 格式
c++·游戏引擎·ps4
tan77º13 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
Mike_Zhang14 小时前
C++使用WinHTTP访问http/https服务
c++
CHANG_THE_WORLD14 小时前
「macOS 系统字体收集器 (C++17 实现)」
开发语言·c++·macos