QWidget::paintEngine 从 QCoreApplication::processEvents 呼叫
QWidget::paintEngine being called from QCoreApplication::processEvents
我正在使用 QOpenGLWidget 将 OSX 应用程序从 Qt 4/Carbon 转换为 Qt5.11。
我已将绘图 "calls" 移至我覆盖的 QOpenGlWidget::paintGL()。
问题是我仍然在控制台上收到这些消息:
QWidget::paintEngine:不应再调用
获取堆栈跟踪,我发现这最终是从 QCoreApplication::processEvents 调用的,我是从我自己的内部事件循环调用的。
这是堆栈跟踪(为便于阅读而编辑)
- 线程 #1,队列 = 'com.apple.main-thread',停止原因 = 断点 1.1
- 帧#0:libQt5Widgets_debug.5.dylib
QWidget::paintEngine()
frame #1: libQt5Widgets_debug.5.dylib
QOpenGLWidget::paintEngine(0)
第 2 帧:libQt5Gui_debug.5.dylibQPainter::begin()
frame #3: libQt5Gui_debug.5.dylib
QPainter::QPainter()
第 4 帧:libQt5Gui_debug.5.dylibQPainter::QPainter()
frame #5: libQt5Widgets_debug.5.dylib
QWidgetPrivate::drawWidget()
第 6 帧:libQt5Widgets_debug.5.dylibQWidgetPrivate::repaint_sys()
frame #7: libQt5Widgets_debug.5.dylib
QWidgetPrivate::syncBackingStore()
第 8 帧:libQt5Widgets_debug.5.dylibQWidgetWindow::handleExposeEvent()
frame #9: libQt5Widgets_debug.5.dylib
QWidgetWindow::event()
第 10 帧:libQt5Widgets_debug.5.dylibQApplicationPrivate::notify_helper()
frame #11: libQt5Widgets_debug.5.dylib
QApplication::notify()
第 12 帧:libQt5Core_debug.5.dylibQCoreApplication::notifyInternal2()
frame #13: libQt5Gui_debug.5.dylib
QCoreApplication::sendSpontaneousEvent()
第 14 帧:libQt5Gui_debug.5.dylibQGuiApplicationPrivate::processExposeEvent()
frame #15: libQt5Gui_debug.5.dylib
QGuiApplicationPrivate::processWindowSystemEvent()
第 16 帧:libQt5Gui_debug.5.dylibbool QWindowSystemInterfacePrivate::handleWindowSystemEvent<QWindowSystemInterface::SynchronousDelivery>()
frame #17: libQt5Gui_debug.5.dylib
void QWindowSystemInterface::handleExposeEvent()
第 18 帧:libqcocoa_debug.dylibQCocoaWindow::handleExposeEvent()
frame #19: libqcocoa_debug.dylib
::-[QNSView updateRegion:](self=0x000061200039fc40, _cmd="updateRegion:", dirtyRegion=QRegion @ 0x00007ffeefbf9b18)
第 20 帧:libqcocoa_debug.dylib::-[QNSView updateLayer](self=0x000061200039fc40, _cmd="updateLayer")
frame #21: AppKit
_NSViewUpdateLayer + 45
第 22 帧:AppKit-[_NSViewBackingLayer display] + 495
frame #23: QuartzCore
CA::Layer::display_if_needed(CA::Transaction*) + 634
第 24 帧:QuartzCoreCA::Context::commit_transaction(CA::Transaction*) + 319
frame #25: QuartzCore
CA::Transaction::commit() + 576
第 26 帧:QuartzCoreCA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 66
frame #27: CoreFoundation
CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23
第 28 帧:CoreFoundation__CFRunLoopDoObservers + 452
frame #29: CoreFoundation
CFRunLoopRunSpecific + 523
第 30 帧:HIToolboxRunCurrentEventLoopInMode + 293
frame #31: HIToolbox
ReceiveNextEventCommon + 618
第 32 帧:HIToolbox_BlockUntilNextEventMatchingListInModeWithFilter + 64
frame #33: AppKit
_DPSNextEvent + 997
第 34 帧:AppKit-[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1362
frame #35: libqcocoa_debug.dylib
QCocoaEventDispatcher::processEvents(this=0x00006040000dbdf0, flags=(i = 0)) 在 qcocoaeventdispatcher.mm:482
第 36 帧:libQt5Core_debug.5.dylib`QCoreApplication::processEvents(flags=(i = 0)) 在 qcoreapplication.cpp:1252
问题是 ::processEvents 最终会为 QOpenGLWidget 调用 ::paintEngine,在 ::paintGL 之外,但这完全不在我的控制范围内。
FWIW,驱动此事件的事件是 QEvent::UpdateRequest。
我尝试在我的 QOpenGLWidget 中覆盖 ::event - 继承 class 以在收到 QEvent::UpdateRequest 时调用 QOpenGlWidget::update,但这最终导致应用程序无响应。
我应该如何处理尝试绘制 QOpenGlWidgets 的 ::processEvents?
谢谢!
我通过从我们的 QOpenGlWidget 子类中删除这条语句来解决这个问题:
setAttribute(Qt::WA_PaintOnScreen,true);
删除它可以避免 paintEngine 调用(并解决了各种其他问题)。
我正在使用 QOpenGLWidget 将 OSX 应用程序从 Qt 4/Carbon 转换为 Qt5.11。
我已将绘图 "calls" 移至我覆盖的 QOpenGlWidget::paintGL()。
问题是我仍然在控制台上收到这些消息:
QWidget::paintEngine:不应再调用
获取堆栈跟踪,我发现这最终是从 QCoreApplication::processEvents 调用的,我是从我自己的内部事件循环调用的。
这是堆栈跟踪(为便于阅读而编辑)
- 线程 #1,队列 = 'com.apple.main-thread',停止原因 = 断点 1.1
- 帧#0:libQt5Widgets_debug.5.dylib
QWidget::paintEngine() frame #1: libQt5Widgets_debug.5.dylib
QOpenGLWidget::paintEngine(0) 第 2 帧:libQt5Gui_debug.5.dylibQPainter::begin() frame #3: libQt5Gui_debug.5.dylib
QPainter::QPainter() 第 4 帧:libQt5Gui_debug.5.dylibQPainter::QPainter() frame #5: libQt5Widgets_debug.5.dylib
QWidgetPrivate::drawWidget() 第 6 帧:libQt5Widgets_debug.5.dylibQWidgetPrivate::repaint_sys() frame #7: libQt5Widgets_debug.5.dylib
QWidgetPrivate::syncBackingStore() 第 8 帧:libQt5Widgets_debug.5.dylibQWidgetWindow::handleExposeEvent() frame #9: libQt5Widgets_debug.5.dylib
QWidgetWindow::event() 第 10 帧:libQt5Widgets_debug.5.dylibQApplicationPrivate::notify_helper() frame #11: libQt5Widgets_debug.5.dylib
QApplication::notify() 第 12 帧:libQt5Core_debug.5.dylibQCoreApplication::notifyInternal2() frame #13: libQt5Gui_debug.5.dylib
QCoreApplication::sendSpontaneousEvent() 第 14 帧:libQt5Gui_debug.5.dylibQGuiApplicationPrivate::processExposeEvent() frame #15: libQt5Gui_debug.5.dylib
QGuiApplicationPrivate::processWindowSystemEvent() 第 16 帧:libQt5Gui_debug.5.dylibbool QWindowSystemInterfacePrivate::handleWindowSystemEvent<QWindowSystemInterface::SynchronousDelivery>() frame #17: libQt5Gui_debug.5.dylib
void QWindowSystemInterface::handleExposeEvent() 第 18 帧:libqcocoa_debug.dylibQCocoaWindow::handleExposeEvent() frame #19: libqcocoa_debug.dylib
::-[QNSView updateRegion:](self=0x000061200039fc40, _cmd="updateRegion:", dirtyRegion=QRegion @ 0x00007ffeefbf9b18) 第 20 帧:libqcocoa_debug.dylib::-[QNSView updateLayer](self=0x000061200039fc40, _cmd="updateLayer") frame #21: AppKit
_NSViewUpdateLayer + 45 第 22 帧:AppKit-[_NSViewBackingLayer display] + 495 frame #23: QuartzCore
CA::Layer::display_if_needed(CA::Transaction*) + 634 第 24 帧:QuartzCoreCA::Context::commit_transaction(CA::Transaction*) + 319 frame #25: QuartzCore
CA::Transaction::commit() + 576 第 26 帧:QuartzCoreCA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 66 frame #27: CoreFoundation
CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23 第 28 帧:CoreFoundation__CFRunLoopDoObservers + 452 frame #29: CoreFoundation
CFRunLoopRunSpecific + 523 第 30 帧:HIToolboxRunCurrentEventLoopInMode + 293 frame #31: HIToolbox
ReceiveNextEventCommon + 618 第 32 帧:HIToolbox_BlockUntilNextEventMatchingListInModeWithFilter + 64 frame #33: AppKit
_DPSNextEvent + 997 第 34 帧:AppKit-[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1362 frame #35: libqcocoa_debug.dylib
QCocoaEventDispatcher::processEvents(this=0x00006040000dbdf0, flags=(i = 0)) 在 qcocoaeventdispatcher.mm:482 第 36 帧:libQt5Core_debug.5.dylib`QCoreApplication::processEvents(flags=(i = 0)) 在 qcoreapplication.cpp:1252
- 帧#0:libQt5Widgets_debug.5.dylib
问题是 ::processEvents 最终会为 QOpenGLWidget 调用 ::paintEngine,在 ::paintGL 之外,但这完全不在我的控制范围内。
FWIW,驱动此事件的事件是 QEvent::UpdateRequest。
我尝试在我的 QOpenGLWidget 中覆盖 ::event - 继承 class 以在收到 QEvent::UpdateRequest 时调用 QOpenGlWidget::update,但这最终导致应用程序无响应。
我应该如何处理尝试绘制 QOpenGlWidgets 的 ::processEvents?
谢谢!
我通过从我们的 QOpenGlWidget 子类中删除这条语句来解决这个问题:
setAttribute(Qt::WA_PaintOnScreen,true);
删除它可以避免 paintEngine 调用(并解决了各种其他问题)。