使用Qt构建光线跟踪器无法在paintEvent

时间:2018-04-17 00:47:29

标签: qt paintevent

我正在使用Qt使用GUI构建光线跟踪器。理想的效果是在计算该像素的RGB值后立即绘制像素,就像在大多数专业渲染器中一样。但是我发现我的跟踪器只能在下面的循环之后显示整个渲染图像:

for(int i=0; i<row; ++i)
    for(int j=0; j<column; ++j) {
        compute pixel value;
        painter.drawPoint(i, j);
    }

我正在绘制主窗口的中央部件。我重新实现了QWidget paintEvent函数并将上面的循环放在这个函数中。似乎paintEvent只在执行一次后显示整个屏幕,并且在此过程中它给了我:

enter image description here

我不知道这是不是paintEvent的工作方式,也不知道我做错了什么。

无论如何,它无法实时显示像素。这对于交互式跟踪器来说非常不满意。我希望你们能提供一些解释和/或解决方案。一百万谢谢!

1 个答案:

答案 0 :(得分:1)

操作系统正在给你&#34;没有响应&#34;警告,因为您正在 GUI线程中进行所有计算。

这意味着事件循环卡住进行havy计算并且无法处理其他事件。

在Windows系统上,这意味着它不会对 Windows消息作出反应。这就是为什么操作系统会在一段时间后告诉您应用程序没有响应的原因。

您应该在分离的线程中执行繁重的计算,当您想要更新GUI并让GUI线程执行渲染时,将结果传递给GUI线程。

除此之外,您应该考虑绘制到后备缓冲区,如评论中所建议的那样(尽管请注意QPixmap不是线程安全的)。

QPainter :: drawPoint()非常慢,是绘制整个中心区域的一种无效方法。

有关如何保持GUI响应的更多详细信息,请查看文档here