利用qt绘制一个有刻度的平面圆形图,然后在平面圆形图里有两条圆心出发的指针为一条黄线和一条红线,红线指针随鼠标移动而移动,黄线指针在鼠标点击时发生移动,用三角函数求平面上两条指针的平面夹角度数,并在ui界面显示每次变化的角度
时间: 2024-03-11 22:48:41 浏览: 15
以下是一个简单的示例代码,可以用Qt绘制一个带刻度的平面圆形图,以及两条指针。你可以根据需要进行修改和完善。
```cpp
#include <QtWidgets>
class CircleWidget : public QWidget
{
public:
CircleWidget(QWidget *parent = nullptr)
: QWidget(parent)
{
m_angle = 0;
}
void setAngle(qreal angle)
{
m_angle = angle;
update();
}
protected:
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制圆形图
painter.setPen(Qt::black);
painter.drawEllipse(rect().adjusted(10, 10, -10, -10));
// 绘制刻度线
painter.save();
painter.translate(rect().center());
painter.rotate(-45);
for (int i = 0; i < 12; ++i) {
painter.drawLine(0, -100, 0, -90);
painter.rotate(30);
}
painter.restore();
// 绘制指针
painter.save();
painter.translate(rect().center());
painter.rotate(m_angle);
// 黄色指针
painter.setPen(Qt::yellow);
painter.drawLine(0, 0, 0, -80);
// 红色指针
painter.setPen(Qt::red);
painter.drawLine(0, 0, 0, -60);
painter.restore();
}
private:
qreal m_angle;
};
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget *parent = nullptr)
: QMainWindow(parent)
{
m_circleWidget = new CircleWidget(this);
setCentralWidget(m_circleWidget);
connect(m_circleWidget, &CircleWidget::mousePressEvent, this, &MainWindow::onMousePress);
connect(m_circleWidget, &CircleWidget::mouseMoveEvent, this, &MainWindow::onMouseMove);
}
private:
void onMousePress(QMouseEvent *event)
{
m_lastPoint = event->pos();
}
void onMouseMove(QMouseEvent *event)
{
QPoint currentPoint = event->pos();
QPoint center = m_circleWidget->rect().center();
qreal dx1 = m_lastPoint.x() - center.x();
qreal dy1 = m_lastPoint.y() - center.y();
qreal dx2 = currentPoint.x() - center.x();
qreal dy2 = currentPoint.y() - center.y();
qreal angle1 = qAtan2(dy1, dx1) * 180 / M_PI;
qreal angle2 = qAtan2(dy2, dx2) * 180 / M_PI;
qreal deltaAngle = angle2 - angle1;
if (deltaAngle < -180) {
deltaAngle += 360;
} else if (deltaAngle > 180) {
deltaAngle -= 360;
}
m_circleWidget->setAngle(m_circleWidget->angle() + deltaAngle);
m_lastPoint = currentPoint;
}
QPoint m_lastPoint;
CircleWidget *m_circleWidget;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
```
注意:这个代码只是一个示例,可能需要根据实际需求进行修改和完善。