以下是使用Qt绘制折线图的示例代码:
#include <QtWidgets>
class LineChartWidget : public QWidget {
public:
LineChartWidget(QWidget *parent = nullptr) : QWidget(parent) {}
void setData(const QVector<QPointF> &data) { m_data = data; }
protected:
void paintEvent(QPaintEvent *) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
const int margin = 10;
QRectF chartRect = rect().adjusted(margin * 2, margin, -margin, -margin);
// Draw axis
painter.drawLine(chartRect.bottomLeft(), chartRect.bottomRight());
painter.drawLine(chartRect.bottomLeft(), chartRect.topLeft());
if (m_data.isEmpty()) return;
// Find min and max values
qreal minX = m_data.first().x();
qreal maxX = m_data.last().x();
qreal minY = std::numeric_limits<qreal>::max();
qreal maxY = std::numeric_limits<qreal>::min();
for (const QPointF &p : m_data) {
minX = std::min(minX, p.x());
maxX = std::max(maxX, p.x());
minY = std::min(minY, p.y());
maxY = std::max(maxY, p.y());
}
// Map data to chart coordinates
QVector<QPointF> mappedData;
for (const QPointF &p : m_data) {
qreal x =
chartRect.left() +
((p.x() - minX) / (maxX - minX)) *
chartRect.width();
qreal y =
chartRect.bottom() -
((p.y() - minY) / (maxY - minY)) *
chartRect.height();
mappedData.append(QPointF(x, y));
}
// Draw line
QPen pen(Qt::blue);
pen.setWidth(2);
painter.setPen(pen);
for (int i = 1; i < mappedData.size(); ++i) {
const QPointF &p1 = mappedData[i - 1];
const QPointF &p2 = mappedData[i];
painter.drawLine(p1, p2);
}
}
private:
QVector<QPointF> m_data;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
LineChartWidget chart;
QVector<QPointF> data = {{0, 5}, {1, 7}, {2, 3}, {3, 8}};
chart.setData(data);
chart.show();
return app.exec();
}
在此示例中,我们首先定义了一个LineChartWidget
类,它继承自QWidget。该类重载了paintEvent函数来绘制折线图。
setData函数用于设置要绘制的数据。在paintEvent中,我们首先确定图表区域的大小和位置。然后计算出最小值和最大值,并将数据映射到图表坐标系上。最后使用QPainter绘制折线。
在main函数中,我们创建了一个LineChartWidget对象并设置数据,然后显示窗口。