当前位置: 代码迷 >> QT开发 >> Qt 画图卡解决方法
  详细解决方案

Qt 画图卡解决方法

热度:761   发布时间:2016-04-25 03:02:04.0
Qt 画图卡
      采用QPainter 先在QPixmap 上面绘图, 然后把QPixmap 绘制到QWidget上。其中的曲线通过对一系列坐标点进行连线(DrawLine) 绘制。 当坐标点的数量较小时(500以下),绘图窗口在拉伸时里面的图形能快速重绘,拉伸的连续性效果较好。当坐标点较多(1000以上)时,这时候绘图反应会变慢,拖动绘图窗口时非常卡,几乎难以拖动。有没有好的解决方案能让绘图坐标点多的时候依然能够快速拖动,而且清晰度(分辨率)保持一定。
     目前已尝试先把Pixmap绘好,然后每次PaintEvent()事件发生时都重绘该保存好了的Pixmap. 虽然可以保持窗体拖动响应,但是Pixmap的分辨率是一定的,当窗体放大时,明显图像的质量下降了。所以要想保持较高的绘图质量似乎还是要调整分辨率后重新绘制,也就出现前面所提的问题了。
    还有一个问题是,我绘图的时候想改变线型,如用虚线绘制,当我的坐标点比较密集时,最终用drawLine分段连成的曲线其线型基本与用实线绘制的一致。有没有解决方案?比如是否能够绘制一条完整的曲线,而不分段绘制,然后改变其线型?
   请教各位!


------解决思路----------------------
新开一个线程,在次线程中绘图,绘制好后用信号通知主线程绘图就可以了。
------解决思路----------------------
应该是你没处理好,绘画是在次线程做,主线程仅仅是把绘制好的图贴出来,不会占用主线程多少CPU时间就不会卡了。
------解决思路----------------------
很多画图的软件,数据太多时都不会把所有点都画出来,而是采用算法把显示的数据合并,舍弃一些点不画。
例如1000 * 1000 的屏幕,水平轴如果画20000个点,多余的19000个点没有任何意义,都是重叠的。
------解决思路----------------------
楼主的这个问题因该是Qt绘制执行效率不高导致的,使用多线程不一定解决问题,很可能界面操作流畅(鼠标操作,弹窗等),图像依然卡顿。

建议一:坐标相对固定(不能总变),且Pixmap不大(小于1024×1024)
做法很简单,就是只在坐标变动时绘制Pixmap,这样只有变动时有卡顿,其他时后很流畅。

建议二:如果不满足以上任意一条,建议使用Directx2D
Directx2D执行效率很高,就算每帧把1000坐标绘制一遍,图像也会很流畅。
其实看到楼主要绘制1000坐标点,就像直接建议这个的,但毕竟不是Qt体制下的,程序修改量会有一些。

个人偏向使用Directx2D,之前遇到过的项目就是因Qt绘制效率不高改用Directx2D解决的。
------解决思路----------------------
看看Qt的示例,有一些关于曲线的,运行流畅呢。
看看 spectrum 示例,里面还有波形图呢。还有qwt开源库能绘制各种图表曲线。
我博客上也有一篇文章是绘图的:http://blog.csdn.net/foruok/article/details/41152297

博客之星,投我一票
------解决思路----------------------
看看QPainterPath吧,不用每次都drawLine
  相关解决方案