Qt 自定义旋钮计算旋转角度,并限制旋转角度实例
时间: 2023-08-16 18:05:57 浏览: 169
在 Qt 中,我们可以通过 QMouseEvent 捕捉鼠标事件并计算旋钮的旋转角度。以下是一个示例实现:
1. 在 Qt Designer 中设计旋钮界面,包括一个圆形进度条和一个指针,将它们都命名为 progress 和 pointer。
2. 在代码中定义一个变量 lastPos 来记录上一次鼠标位置,以便计算鼠标移动的距离。
3. 在 QWidget 中重写 mousePressEvent、mouseReleaseEvent 和 mouseMoveEvent 函数,分别处理鼠标按下、松开和移动事件。
4. 在 mousePressEvent 中记录初始鼠标位置,并将鼠标捕获到进度条上,以便在移动鼠标时能够实时响应。
5. 在 mouseReleaseEvent 中释放鼠标捕获,并重置 lastPos 变量。
6. 在 mouseMoveEvent 中计算鼠标移动距离,并根据距离计算旋钮旋转角度,同时限制旋转角度在 0 到 360 度之间。最后更新指针的旋转角度即可。
以下是一个示例代码:
```
class CustomKnob : public QWidget
{
Q_OBJECT
public:
explicit CustomKnob(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private:
qreal lastPos;
qreal currentAngle;
QProgressBar *progress;
QLabel *pointer;
};
CustomKnob::CustomKnob(QWidget *parent)
: QWidget(parent)
{
// 设置进度条
progress = new QProgressBar(this);
progress->setMinimum(0);
progress->setMaximum(360);
progress->setValue(0);
progress->setFixedSize(100, 100);
progress->setStyleSheet("QProgressBar{border:none;text-align:center;}"
"QProgressBar::chunk{background-color:#25c";});
// 设置指针
pointer = new QLabel(this);
pointer->setFixedSize(20, 60);
pointer->setStyleSheet("QLabel{background-color:white;border-radius:10px;}");
pointer->move(40, 20);
lastPos = 0;
currentAngle = 0;
}
void CustomKnob::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
lastPos = event->x();
progress->grabMouse();
}
}
void CustomKnob::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
progress->releaseMouse();
lastPos = 0;
}
}
void CustomKnob::mouseMoveEvent(QMouseEvent *event)
{
if (lastPos > 0 && event->buttons() & Qt::LeftButton) {
qreal delta = event->x() - lastPos;
currentAngle += delta;
if (currentAngle < 0) {
currentAngle = 0;
}
if (currentAngle > 360) {
currentAngle = 360;
}
progress->setValue(static_cast<int>(currentAngle));
pointer->setStyleSheet(QString("QLabel{background-color:white;border-radius:10px;transform:rotate(%1deg);}").arg(currentAngle));
lastPos = event->x();
}
}
```
在实际使用时,可以将 CustomKnob 添加到主窗口或其他布局中即可。
阅读全文