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)组件,这个组件能够以一种直观和美观的方式展示图标,并允许用户通过点击来选择不同的图标。这种组件在多种应用程序中都有潜在的用途,例如在媒体播放器、图形设计软件或任何需要快速访问不同工具或选项的软件中。