在 Qt 中绘制绘图的最佳方法是什么?

What is the best way to draw plots in Qt?

我正在使用 Qt 绘制这样的频谱图:

。 我还希望能够 select 图形区域并对其进行编辑,以及滚动和缩放。

我正在考虑 QGraphicsView class 但不确定其性能。据我所知,QGraphicsView 中的对象是单独存储的,绘制大量点可能会影响性能。

我应该使用什么 Qt classes 来实现这个?

我建议您为此目的使用 QCustomPlot or Qwt。 两者都有很好的文档。

如果您选择使用 Qwt,请查看 QwtPlotSpectrogram Class

QCustomPlot 是外部库,如果您正在寻找 QT 原生的东西,请查看 QPainter class

绝对不要对每个 dot/mark 使用 QGraphicsItem。好的方法是生成代表您的频谱图的 QPixmap,然后将此像素图作为单个项目放入 QGraphicsSceneQGraphicsPixmapItem 可用于此)。

要在 QPixmap 上绘制,请使用 QPainter。也许一个小例子会有用:

const int spectrWidth = 1000;
const int spectrHeight = 500;
QPixmap spectrPixmap(spectrWidth, spectrHeight);
QPainter p(&spectrPixmap);

for (int ir = 0; ir < spectrHeight; ir++)
{
    for (int ic = 0; ic < spectrWidth; ic++)
    {
        double data = getDataForCoordinates(ic, ir); // your function
        QColor color = getColorForData(data);  // your function
        p.setPen(color);
        p.drawPoint(ic, ir);
    }
}

getDataForCoordinates()getColorForData() 只是演示其工作原理的示例函数。你可能有不同的方式来获取数据和它的颜色。

编辑

但是,如果您不需要 zoom/pan 功能,那么直接在 QWidget::paintEvent() 中的 QWidget 上绘画而不使用 QGraphicsView 会更简单/QGraphicScene 完全没有。