我正在使用QOpenGLWidget将OSX应用程序从Qt 4/Carbon转换为Qt5.11。
我已经将绘图"调用"移到了我覆盖的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.dylibQPainter::begin() frame #3: libQt5Gui_debug.5.dylib
QPainter::QPainter((第4帧:libQt5Gui_debug.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
QWidget窗口::event((帧#10:libQt5Widgets_debug.5.dylibQApplicationPrivate::notify_helper() frame #11: libQt5Widgets_debug.5.dylib
Q应用程序::notify((第12帧:libQt5Core_debug.5.dylibQCoreApplication::notifyInternal2() frame #13: libQt5Gui_debug.5.dylib
QCore应用程序::sendSponatureEvent((帧#14:libQt5Gui_debug.dylibQGuiApplicationPrivate::processExposeEvent() frame #15: libQt5Gui_debug.5.dylib
QGuiApplicationPrivate::processWindowSystemEvent((帧#16:libQt5Gui_debug.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::层::display_if_fneed(CA::事务*(+634帧#24:QuartzCoreCA::Context::commit_transaction(CA::Transaction*) + 319 frame #25: QuartzCore
CA::事务::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最终在::paintGL之外为QOpenGLWidget调用:paintEngine,但这完全超出了我的控制范围。
FWIW,驱动它的事件是一个QEvent::UpdateRequest。
当我的QOpenGLWidget继承类接收到QEvent::UpdateRequest时,我尝试重写该类中的::事件来调用QOpenGLWidget::update,但最终导致应用程序没有响应。
我应该如何处理:processEvents试图绘制QOpenGlWidgets?
谢谢!
我通过从我们的QOpenGlWidget子类中删除此语句来修复此问题
setAttribute(Qt::WA_PaintOnScreen,true(
删除这个得到了油漆引擎的调用(并解决了所有其他问题(。