我有一个 QOGLWidget 小部件,它构建在另一个窗口中,由 QMainwindow 中的按钮激活。我正在尝试将图像的表面从小部件发送到主窗口的 QOGLWidget,它崩溃并给出第一次机会异常访问冲突的问题。
1 回答
在这种情况下,我认为可能会发生三件事:
Qt::自动连接
您的帧生成器和 GUI(SimulatorWindow + GLSimulatorWidget)之间的连接由Qt::AutoConnection连接,当它们驻留在单独的线程上时最终变成Qt::DirectConnection 。指定Qt::QueuedConnection的连接来解决这个问题(如果它们确实在不同的线程上)。
QPixmap 诉 QImage
您可以在 GUI 线程之外处理QPixmap。这通常会打印出警告,但可能仍然有效。通常,如果您不在 GUI 线程中处理图像,然后将其发送到 GUI 线程,则需要使用QPixmap以外的东西,例如QImage。
堆栈上的初始化
您的框架对象在到达您的 GUI 时可能已经超出范围。例如,如果您构建一个框架,并将其存储在堆栈的本地范围中,然后将其传递给处理程序或容器......
...然后,当您离开本地范围以在 GUI 中表示对象时,您的框架对象将消失,并且您的处理程序/容器将保留一个错误的指针。
为了解决这个问题,初始化到堆上并坚持使用Qt Object Model。我也喜欢将我的容器放在堆上,作为它们所属类的成员变量。
总而言之:检查您的连接类型,如果您的帧生成器是否在 GUI 线程上,如果您在不是 GUI 的线程中,请使用 QImage 而不是 QPixmap,并确保您的指针没有超出范围。