• 6366阅读
  • 4回复

[提问]qt画出的图形无法显示出全部数据? [复制链接]

上一主题 下一主题
离线bo2256331
 

只看楼主 倒序阅读 楼主  发表于: 2016-01-07
回复本帖可获得1点威望奖励!
每人最多可获奖1次,奖池剩余4点威望 (中奖几率10%)
关键词: qwt绘图
用qt做一个界面,目的是画出频谱图,使用qwt库,发现导入数据后,不同窗口大小显示的数据不一样,比如默认窗口大小显示大小如下

拉长后显示如下
放到最大时候显示如下

代码如下:
plot.h
  1. #include <qwt_plot.h>
  2. #include <qwt_plot_spectrogram.h>
  3. class Plot : public QwtPlot
  4. {
  5.     Q_OBJECT
  6. public:
  7.     Plot(QWidget * = NULL);
  8.     public slots:
  9. private:
  10.     QwtPlotSpectrogram *d_spectrogram;
  11. };
plot.cpp
  1. #include <qprinter.h>
  2. #include <qprintdialog.h>
  3. #include <qnumeric.h>
  4. #include <qwt_color_map.h>
  5. #include <qwt_plot_spectrogram.h>
  6. #include <qwt_scale_widget.h>
  7. #include <qwt_scale_draw.h>
  8. #include <qwt_plot_zoomer.h>
  9. #include <qwt_plot_panner.h>
  10. #include <qwt_plot_layout.h>
  11. #include <qwt_plot_renderer.h>
  12. #include <qwt_matrix_raster_data.h>
  13. #include "plot.h"
  14. #include <QFile>
  15. #include<QtAlgorithms>
  16. class MyZoomer : public QwtPlotZoomer
  17. {
  18. public:
  19.     MyZoomer(QWidget *canvas) :
  20.         QwtPlotZoomer(canvas)
  21.     {
  22.         setTrackerMode(AlwaysOn);
  23.     }
  24.     virtual QwtText trackerTextF(const QPointF &pos) const
  25.     {
  26.         QColor bg(Qt::white);
  27.         //设置背景透明度
  28.         bg.setAlpha(20);
  29.         //QwtPlotZoomer::trackerTextF返回x,y的坐标轴的刻度数
  30.         QwtText text = QwtPlotZoomer::trackerTextF(pos);
  31.         text.setBackgroundBrush(QBrush(bg));
  32.         return text;
  33.     }
  34. };
  35. class SpectrogramData : public QwtMatrixRasterData
  36. {
  37. public:
  38.     SpectrogramData()
  39.     {
  40.         QFile data("H:/STUDY/Qtproject/spectromgramTest/est.bin");
  41.         if (data.open(QFile::ReadOnly))
  42.         {
  43.             QDataStream instream(&data);
  44.             QVector<double> rawData;
  45.             double *temp = new double[10000 * 300];
  46.             instream.readRawData((char*)temp, 10000 * 300 * sizeof(double));
  47.             for (int i = 0; i < 10000; i++)
  48.             {
  49.                 for (int j = 0; j < 300; j++)
  50.                 {
  51.                     rawData += temp[j * 10000 + i];
  52.                 }
  53.             }
  54.     
  55.         setValueMatrix(rawData, 300);
  56.         delete[] temp;
  57.             }
  58.         setInterval(Qt::XAxis, QwtInterval(0, 1));
  59.         setInterval(Qt::YAxis, QwtInterval(0,10));
  60.         setInterval(Qt::ZAxis, QwtInterval(0.0, 0.01));
  61.     }
  62. };
  63. class LinearColorMapRGB : public QwtLinearColorMap
  64. {
  65. public:
  66.     LinearColorMapRGB() :
  67.         //首尾颜色
  68.         QwtLinearColorMap(Qt::darkCyan, Qt::red, QwtColorMap::RGB)
  69.     {
  70.         addColorStop(0.0, Qt::black);
  71.         addColorStop(0.6, Qt::green);
  72.         addColorStop(0.75, Qt::white);
  73.     }
  74. };
  75. Plot::Plot(QWidget *parent) :
  76. QwtPlot(parent)
  77. {
  78.     d_spectrogram = new QwtPlotSpectrogram();
  79.     // use system specific thread count
  80.     //设置线程数和缓存,影响不大
  81.     d_spectrogram->setRenderThreadCount(0);
  82.     d_spectrogram->setCachePolicy(QwtPlotRasterItem::PaintCache);
  83.     d_spectrogram->setData(new SpectrogramData());
  84.     d_spectrogram->attach(this);
  85.     //设置轮廓线的数量和层次(当值为多少时画一条轮廓线)
  86.     QList<double> contourLevels;
  87.     for ( double level =0.001; level <0.1; level += 0.002)
  88.         contourLevels += level;//不是相加,是在其后面添加元素
  89.     d_spectrogram->setContourLevels( contourLevels );
  90.     const QwtInterval zInterval = d_spectrogram->data()->interval(Qt::ZAxis);
  91.     // A color bar on the right axis
  92.     QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight);
  93.     rightAxis->setTitle("Intensity");
  94.     //仅设置这个还不行
  95.     rightAxis->setColorBarEnabled(true);
  96.     setAxisScale(QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue());
  97.     enableAxis(QwtPlot::yRight);//默认disabed
  98.     //设置画布对齐到所有坐标轴
  99.     plotLayout()->setAlignCanvasToScales(true);
  100.     //设置为RGBColorMap
  101.     d_spectrogram->setColorMap(new LinearColorMapRGB());
  102.     rightAxis->setColorMap(zInterval, new LinearColorMapRGB());
  103.     //设置显示模式
  104.     d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ContourMode,true);
  105.     d_spectrogram->setDisplayMode( QwtPlotSpectrogram::ImageMode, false);
  106.     //设置鼠标操作
  107.     // LeftButton for the zooming
  108.     // MidButton for the panning
  109.     // RightButton: zoom out by 1
  110.     // Ctrl+RighButton: zoom out to full size
  111.     QwtPlotZoomer* zoomer = new MyZoomer(canvas());
  112.     //修改某一操作,比如一步返回到不放大状态
  113.     zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
  114.         Qt::RightButton, Qt::ControlModifier);
  115.     zoomer->setMousePattern(QwtEventPattern::MouseSelect3,
  116.         Qt::RightButton);
  117.     const QColor c(Qt::red);
  118.     //设置RubberBandPen选择框笔触
  119.     zoomer->setRubberBandPen(c);
  120.     //设置TrackerPen笔触
  121.     zoomer->setTrackerPen(c);
  122.     QwtPlotPanner *panner = new QwtPlotPanner(canvas());
  123.     //移动绘图时候右边colorbar不需要自动改变刻度
  124.     panner->setAxisEnabled(QwtPlot::yRight, false);
  125.     panner->setMouseButton(Qt::MidButton);
  126.     // Avoid jumping when labels with more/less digits
  127.     // appear/disappear when scrolling vertically
  128.     const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font());
  129.     QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
  130.     sd->setMinimumExtent(fm.width("100.00"));
  131. }

请问用什么办法使其显示出所有数据?困扰好久,感激不尽!



离线kimtaikee

只看该作者 1楼 发表于: 2016-01-07
传个小demo看看,附代码。

离线bo2256331

只看该作者 2楼 发表于: 2016-01-10
回 kimtaikee 的帖子
kimtaikee:传个小demo看看,附代码。 (2016-01-07 20:23) 

谢谢问题解决了,把数据量减小了十倍,才基本显示出来,但是不是很明白为什么数据大就显示不出来
离线kimtaikee

只看该作者 3楼 发表于: 2016-01-10
回 bo2256331 的帖子
bo2256331:谢谢问题解决了,把数据量减小了十倍,才基本显示出来,但是不是很明白为什么数据大就显示不出来 (2016-01-10 16:39) 

那就是问题还没解决。

离线hnsyzlc

只看该作者 4楼 发表于: 2016-01-11
回 bo2256331 的帖子
回帖奖励+ 1
bo2256331:谢谢问题解决了,把数据量减小了十倍,才基本显示出来,但是不是很明白为什么数据大就显示不出来 (2016-01-10 16:39) 

你这是强行解决问题啊
快速回复
限100 字节
 
上一个 下一个