QWidget::paintEngine being called from QCoreApplication::pro



我正在使用QOpenGLWidget将OSX应用程序从Qt 4/Carbon转换为Qt5.11。

我已经将绘图"调用"移到了我覆盖的QOpenGlWidget::paintGL((中。

问题是我仍然在控制台上收到这些消息:

QWidget::paintEngine:不应再被称为

在获取堆栈跟踪时,我发现这最终是从QCoreApplication::processEvents调用的,我从自己的内部事件循环调用它。

这是一个堆栈跟踪(为了可读性而编辑(

  • 线程#1,队列="com.apple.main thread",停止原因=断点1.1
    • 帧#0:libQt5Widgets_debug.5.dylibQWidget::paintEngine() frame #1: libQt5Widgets_debug.5.dylibQOpenGLWidget::paintEngine(0(第2帧:libQt5Gui_debug.dylibQPainter::begin() frame #3: libQt5Gui_debug.5.dylibQPainter::QPainter((第4帧:libQt5Gui_debug.dylibQPainter::QPainter() frame #5: libQt5Widgets_debug.5.dylibQWidgetPrivate::drawWidget((帧#6:libQt5Widgets_debug.5.dylibQWidgetPrivate::repaint_sys() frame #7: libQt5Widgets_debug.5.dylibQWidgetPrivate::syncBackingStore((帧#8:libQt5Widgets_debug.5.dylibQWidgetWindow::handleExposeEvent() frame #9: libQt5Widgets_debug.5.dylibQWidget窗口::event((帧#10:libQt5Widgets_debug.5.dylibQApplicationPrivate::notify_helper() frame #11: libQt5Widgets_debug.5.dylibQ应用程序::notify((第12帧:libQt5Core_debug.5.dylibQCoreApplication::notifyInternal2() frame #13: libQt5Gui_debug.5.dylibQCore应用程序::sendSponatureEvent((帧#14:libQt5Gui_debug.dylibQGuiApplicationPrivate::processExposeEvent() frame #15: libQt5Gui_debug.5.dylibQGuiApplicationPrivate::processWindowSystemEvent((帧#16:libQt5Gui_debug.dylibbool QWindowSystemInterfacePrivate::handleWindowSystemEvent<QWindowSystemInterface::SynchronousDelivery>() frame #17: libQt5Gui_debug.5.dylibvoid 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: QuartzCoreCA::层::display_if_fneed(CA::事务*(+634帧#24:QuartzCoreCA::Context::commit_transaction(CA::Transaction*) + 319 frame #25: QuartzCoreCA::事务::commit((+576第26帧:QuartzCoreCA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 66 frame #27: CoreFoundationCFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION+23第28帧:CoreFoundation__CFRunLoopDoObservers + 452 frame #29: CoreFoundationCFRunLoopRunSpecific+523帧#30:HIToolboxRunCurrentEventLoopInMode + 293 frame #31: HIToolboxReceiveNextEventCommon+618帧#32:HIToolbox_BlockUntilNextEventMatchingListInModeWithFilter + 64 frame #33: AppKit_DPSNextEvent+997帧#34:AppKit-[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1362 frame #35: libqcocoa_debug.dylibQCocoaEventDispatcher::processEvents(this=0x00006040000dbdf0,flags=(i=0((在QCocoaEventDispatcher.mm:482帧#36:libQt5Core_debug.5.dylib`QCoreApplication::processEvents(flags=(i=0((,位于QCoreApplication.cpp:1252

问题是:processEvents最终在::paintGL之外为QOpenGLWidget调用:paintEngine,但这完全超出了我的控制范围。

FWIW,驱动它的事件是一个QEvent::UpdateRequest。

当我的QOpenGLWidget继承类接收到QEvent::UpdateRequest时,我尝试重写该类中的::事件来调用QOpenGLWidget::update,但最终导致应用程序没有响应。

我应该如何处理:processEvents试图绘制QOpenGlWidgets?

谢谢!

我通过从我们的QOpenGlWidget子类中删除此语句来修复此问题

setAttribute(Qt::WA_PaintOnScreen,true(

删除这个得到了油漆引擎的调用(并解决了所有其他问题(。

相关内容

  • 没有找到相关文章

最新更新