标题:高手进来帮忙看看,qt 多线程绘图,graphicsview等
作者:onlyone
日期:2019-09-16 09:28
内容:
现在项目需要多线程绘图。在网上看到一个结论:QImage QPixMap 只要调用绘图功能,都只能在主线程GUI中调用。子线程是不能操作绘图函数的。
第一个问题:这个说法对吗?我自认为该说法是对的。网上有些在子线程调用drawline 等方法的例子,可能都是瞎倒腾。
第二个问题:如果真的只能在主线程绘图,那么是不是QT就没有办法多线程绘图了呢?
尤其是结合graphicsScene 等,如何进行多线程绘图?
#1 [汉阳青川 09-16 10:24]
请深入学习理解一下MVC思想
#2 [笑颜 09-16 10:26]
我简单试了试,不存在QImage不能在子线程绘制的说法啊!
void XYTestThread::run()
{
QImage image(400, 400, QImage::Format_ARGB32_Premultiplied);
QPainter painter(&image);
painter.fillRect(image.rect(), QColor(rand() % 255, rand() % 255, rand() % 255));
while (!mExit) {
usleep(1000*30);
painter.drawLine(QPoint(rand() % 400, rand() % 400),
QPoint(rand() % 400, rand() % 400));
emit updateImage(image);
}
}
#3 回 笑颜 的帖子 [onlyone 09-16 11:04]
笑颜:
我简单试了试,不存在QImage不能在子线程绘制的说法啊!
void XYTestThread::run()
....... (2019-09-16 10:26)
网上看过很多论点,都是说这样写,一时不会出问题。但是跑的时间长了,程序复杂了,就会出现问题。就是不想通过实验的方式,而是看看官方有无明确说法。
#4 回 汉阳青川 的帖子 [onlyone 09-16 11:07]
汉阳青川:请深入学习理解一下MVC思想 (2019-09-16 10:24)
我们项目现在还真就是MVC。不过多线程绘图,是为了提高绘图效率。想把每张图放在单独的线程中回去,主线程最后负责贴图显示。就是没看到QT明确说法,子线程能否调用绘图函数。网上结论两边倒,有的说行,有的说不行。
#5 [onlyone 09-16 11:20]
既然你用Qt,那么就该明白:所有绘图、显示、界面部分,必须放主线程!对于数据接收,串口也罢、网络tcp也好,你可以在线程操作,当接到一定的数据,然后从线程发信号出来,GUI主线程接收并绘制!你摆好这个架构,再谈CPU与内存!你cpu并不解码、也不做费时算法,能耗那么大,与你框架搭配有显著影响
----以上是摘自一个csdn帖子中的说法。这里是否有明白人,能不能给个官方的说法?
我理解,可以把图像的获取放在子线程中。但是图像的绘制,与显示,必须只能放在主线程中?