QT开发中文网

用qt绘制折线图

以下是使用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对象并设置数据,然后显示窗口。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2091

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?