我正在使用Qt绘制这样的谱图:
我正在考虑QGraphicsView
课程但不确定其表现。据我所知,QGraphicsView
中的对象是单独存储的,绘制大量的点可能会影响性能。
我应该使用哪些Qt类来实现这一目标?
答案 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)
我建议您为此目的使用QCustomPlot或Qwt。 两者都有很好的文档。
如果您选择与Qwt合作,请查看QwtPlotSpectrogram Class。
答案 2 :(得分:0)
QCustomPlot是外部库,如果您正在寻找QT原生内容,请查看QPainter class。