C++Qt实现在QGroupBox中绘制坐标图,包含横坐标及横坐标名称,纵坐标及纵坐标名称,并且光标能随着鼠标左右移动
时间: 2024-03-06 16:52:13 浏览: 210
好的,这是一个需要使用 Qt 的绘图框架来实现的功能。具体实现步骤如下:
1. 在 Qt Designer 中添加一个 QGroupBox 控件,用于容纳绘图区域。
2. 在该 QGroupBox 中添加一个自定义控件,用于绘制坐标图。
3. 在自定义控件的构造函数中,初始化绘图区域,包括坐标轴、坐标名称等信息。
4. 在自定义控件中重写 paintEvent 函数,实现绘制坐标图的功能。在该函数中,使用 QPainter 对象来绘制坐标轴、坐标名称和数据点等信息。
5. 在自定义控件中重写 mouseMoveEvent 函数,实现光标随着鼠标左右移动的功能。在该函数中,使用 QCursor 对象来设置光标的位置。
以下是一个简单的实现示例:
```cpp
// CustomWidget.h
#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H
#include <QWidget>
class CustomWidget : public QWidget
{
Q_OBJECT
public:
explicit CustomWidget(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private:
int m_marginLeft;
int m_marginBottom;
int m_width;
int m_height;
int m_numX;
int m_numY;
QVector<double> m_data;
QString m_nameX;
QString m_nameY;
double m_minX;
double m_maxX;
double m_minY;
double m_maxY;
double m_scaleX;
double m_scaleY;
int m_cursorX;
};
#endif // CUSTOMWIDGET_H
```
```cpp
// CustomWidget.cpp
#include "CustomWidget.h"
#include <QPainter>
CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent)
{
m_marginLeft = 50;
m_marginBottom = 30;
m_width = 400;
m_height = 300;
m_numX = 6;
m_numY = 5;
m_data << 0.1 << 0.3 << 0.2 << 0.4 << 0.5 << 0.2;
m_nameX = "X轴";
m_nameY = "Y轴";
m_minX = 0;
m_maxX = m_data.size() - 1;
m_minY = 0;
m_maxY = 1;
m_scaleX = m_width / (m_maxX - m_minX);
m_scaleY = m_height / (m_maxY - m_minY);
m_cursorX = -1;
}
void CustomWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 绘制坐标轴
painter.drawLine(m_marginLeft, m_height, m_marginLeft, 0);
painter.drawLine(m_marginLeft, m_height, m_width, m_height);
// 绘制坐标名称
painter.drawText(m_marginLeft + m_width / 2, m_height + m_marginBottom / 2, m_nameX);
painter.save();
painter.rotate(-90);
painter.drawText(-m_height / 2, m_marginLeft / 2, m_nameY);
painter.restore();
// 绘制数据点
QPoint lastPoint;
for (int i = 0; i < m_data.size(); i++) {
QPoint currentPoint(m_marginLeft + i * m_scaleX, m_height - m_data[i] * m_scaleY);
painter.drawEllipse(currentPoint, 3, 3);
if (i > 0) {
painter.drawLine(lastPoint, currentPoint);
}
lastPoint = currentPoint;
}
// 绘制光标
if (m_cursorX >= 0) {
QPoint cursorPoint(m_marginLeft + m_cursorX * m_scaleX, 0);
painter.drawLine(cursorPoint, QPoint(cursorPoint.x(), m_height));
}
}
void CustomWidget::mouseMoveEvent(QMouseEvent *event)
{
int x = event->x() - m_marginLeft;
if (x < 0 || x > m_width) {
m_cursorX = -1;
} else {
m_cursorX = x / m_scaleX;
}
update();
}
```
使用该自定义控件时,需要将其添加到 QGroupBox 中,并设置 QGroupBox 的布局方式为 QHBoxLayout,以使自定义控件能够占据整个 QGroupBox 的空间。完整示例代码如下:
```cpp
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "CustomWidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
CustomWidget *m_customWidget;
};
#endif // MAINWINDOW_H
```
```cpp
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QHBoxLayout>
#include <QGroupBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_customWidget = new CustomWidget(this);
QGroupBox *groupBox = new QGroupBox(this);
groupBox->setTitle("坐标图");
QHBoxLayout *layout = new QHBoxLayout(groupBox);
layout->addWidget(m_customWidget);
groupBox->setLayout(layout);
setCentralWidget(groupBox);
}
MainWindow::~MainWindow()
{
delete ui;
}
```
运行程序后,即可看到绘制出的坐标图,并能够随着鼠标左右移动。
阅读全文