From d0538f6d3547f4c5a92164f369adf51b5311bea9 Mon Sep 17 00:00:00 2001 From: chenyuanbo Date: Mon, 3 Aug 2026 11:06:11 +0800 Subject: [PATCH] fix(dtkdeclarative): prevent startTimer warning when event dispatcher is unavailable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DQuickDciIconImage::scheduleLayout() may be invoked via itemChange() or geometryChange() hooks during the destruction of ListView delegate items reparented to QCoreApplication via QQmlDelegateModel. At that point, ~QCoreApplication() has already set eventDispatcher to nullptr , causing QObject::startTimer() to emit: "QObject::startTimer: Timers can only be used with threads started with QThread" Log: Fix startTimer warning for DciIcon Influence: 1. DciIcon displays correctly; 2. When the program exits, DciIcon in containers such as ListView and Repeater does not have a startTimer warning fix(dtkdeclarative): 修复 eventDispatcher 不可用时 startTimer 告警 ListView delegate item 经 QQmlDelegateModel 重挂到 QCoreApplication 后,在 ~QCoreApplication() 的 ~QObject::deleteChildren() 阶段析构。 此时 itemChange()/geometryChange() 钩子触发 scheduleLayout() → QTimer::start() → QObject::startTimer(),但 ~QCoreApplication() 体 已在基类析构体之前将 eventDispatcher 置空,导致以下告警: "QObject::startTimer: Timers can only be used with threads started with QThread" Log: 修复DciIcon的startTimer警告 Influence: 1.DciIcon正确显示; 2.程序退出时,ListView、Repeater等容器中的DciIcon没有startTimer警告 PMS: TASK-392413 --- src/private/dquickdciiconimage.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/private/dquickdciiconimage.cpp b/src/private/dquickdciiconimage.cpp index 500e6a41..24ecea34 100644 --- a/src/private/dquickdciiconimage.cpp +++ b/src/private/dquickdciiconimage.cpp @@ -482,7 +482,10 @@ void DQuickDciIconImage::geometryChange(const QRectF &newGeometry, const QRectF void DQuickDciIconImage::itemChange(ItemChange change, const ItemChangeData &value) { QQuickItem::itemChange(change, value); - if (change == ItemParentHasChanged || change == ItemDevicePixelRatioHasChanged || change == ItemSceneChange) { + + if ((change == ItemParentHasChanged && parentItem()) + || change == ItemDevicePixelRatioHasChanged + || change == ItemSceneChange) { d_func()->scheduleLayout(); } }