回复: 高手进来帮忙看看,qt 多线程绘图,graphicsview等
#6 [onlyone 09-16 11:24]
https://bbs.csdn.net/topics/380244771
这个帖子说的还可以了。QImage 貌似可以在子线程,按照填色的方式绘图。至于能不能使用QImage调用drawline ,估计还是会有问题。
但是 QPixMap 肯定是不能在子线程中绘图的。
#7 [20091001753 09-16 20:45]
线程的限制,是指绘制界面的功能,必须在主线程。
QImage,是图片数据,你爱怎么修改,在什么线程修改,都无所谓。
但是将 QImage 的内容,绘制到 widget 上,只能在主线程。
#8 [stlcours 09-16 23:45]
可能是Windows做的比较牛,或者说Windows容错性比较高(故意这样做),一般情况下在线程里直接操作UI元素也没有问题。有一次我偷懒,就是这么做的,Windows下一直使用没问题,结果同样的代码放到Mac下编译运行,程序直接崩溃!不知道是Mac弱还是Mac严格
结论:不能放到线程里操作UI,就算行也是一时的,就算一直都没有出问题,也只是你运气好,哪天Windows不高兴了,不好意思,分分钟让你崩溃。
#9 回 20091001753 的帖子 [onlyone 09-17 10:04]
20091001753:线程的限制,是指绘制界面的功能,必须在主线程。
QImage,是图片数据,你爱怎么修改,在什么线程修改,都无所谓。
但是将 QImage 的内容,绘制到 widget 上,只能在主线程。 (2019-09-16 20:45)
你这个说法比较靠谱。
我找到官方说法了。
Because QImage is a QPaintDevice subclass, QPainter can be used to draw directly onto p_w_picpath. When using QPainter on a QImage, the painting can be performed in another thread than the current GUI thread.
使用QImage时,可以在子线程中使用QPinter在其上做图。
#10 [九重水 09-17 10:23]
画图,分为 1 在界面显示,和 2 在缓存(或显存)绘制两个部分;
界面显示,自然要在主线程;
在缓存绘制,自然哪里都可以。
我曾经做过喷码机,绘制的时候就是‘不在’主线程做的,画完后直接将绘好的画面复制到显示的区域;
如果要用伪代码表示:
dataBuf.xxx操作,各种函数调用,只操作数据;
搞完后,xxx.show,这个show其实就是拷贝画好的画面。