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

时间:2016-05-04 04:03:14

标签: c++ qt graphics qgraphicsview

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

spectrogram。 我还希望能够选择图形的区域并进行编辑,以及滚动和缩放。

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

我应该使用哪些Qt类来实现这一目标?

3 个答案:

答案 0 :(得分:2)

绝对不要对每个点/标记使用QGraphicsItem。好的方法是生成一个代表你的频谱图的QPixmap,然后将这个像素图放在QGraphicsScene作为单个项目(QGraphicsPixmapItem可用于此)。

要在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()只是展示其如何运作的示例函数。您可能有不同的方式获取数据及其颜色。

修改

但是如果你不需要缩放/平移功能,那么直接在QWidget的{​​{1}}上绘画而不是使用QWidget::paintEvent() / {{1完全没有。

答案 1 :(得分:1)

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

如果您选择与Qwt合作,请查看QwtPlotSpectrogram Class

答案 2 :(得分:0)

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