From 1ebe14a5baec881a15eae6a75127f3741f10aafe Mon Sep 17 00:00:00 2001 From: yeshanshan Date: Tue, 10 Mar 2026 15:03:02 +0800 Subject: [PATCH] fix: optimize window button display delay issue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Replaced Loader components with direct WindowButton instances to eliminate loading delays 2. Added cached properties for motifFunctions bitwise operations to avoid repeated calculations 3. Simplified size resizable check by comparing width/height values directly instead of creating Size objects 4. Changed visibility control from Loader.active to WindowButton.visible for smoother transitions 5. Improved performance by reducing object creation and property recalculations Log: Fixed window control buttons flashing/delayed appearance issue Influence: 1. Test window minimize/maximize/close buttons appear instantly without delay 2. Verify button visibility changes correctly when entering/exiting fullscreen mode 3. Test button states update properly when window flags change 4. Verify all window buttons remain functional with correct enabled/ disabled states 5. Test performance impact during window resizing and state transitions 6. Verify no visual glitches when toggling between windowed and fullscreen modes fix: 优化标题栏窗口按钮延迟闪现问题 1. 将 Loader 组件替换为直接的 WindowButton 实例,消除加载延迟 2. 添加缓存的 motifFunctions 位运算属性,避免重复计算 3. 简化可调整大小检查,直接比较宽高值而不是创建 Size 对象 4. 将可见性控制从 Loader.active 改为 WindowButton.visible,实现更平滑的 过渡 5. 通过减少对象创建和属性重计算来提升性能 Log: 修复窗口控制按钮闪现/延迟显示问题 Influence: 1. 测试窗口最小化/最大化/关闭按钮是否立即显示无延迟 2. 验证进入/退出全屏模式时按钮可见性是否正确变化 3. 测试窗口标志改变时按钮状态是否正确更新 4. 验证所有窗口按钮功能正常,启用/禁用状态正确 5. 测试窗口调整大小和状态转换时的性能影响 6. 验证在窗口模式和全屏模式切换时无视觉闪烁 PMS: BUG-351921 --- qt6/src/qml/WindowButtonGroup.qml | 110 +++++++++++++++--------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/qt6/src/qml/WindowButtonGroup.qml b/qt6/src/qml/WindowButtonGroup.qml index 440018fa..a86a9de1 100644 --- a/qt6/src/qml/WindowButtonGroup.qml +++ b/qt6/src/qml/WindowButtonGroup.qml @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2021 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -19,92 +19,90 @@ RowLayout { property var __dwindow: Window.window.D.DWindow property bool __forceHind: !__dwindow.enabled || embedMode || Window.window.visibility === Window.FullScreen + + // 缓存 motifFunctions 位运算结果,避免重复计算 + readonly property bool __canMinimize: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MINIMIZE + readonly property bool __canMaximize: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE + readonly property bool __canResize: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE + readonly property bool __canClose: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE onMaxOrWinded: { - if (!(__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE)) { + if (!__canMaximize) { return } if (Window.window.visibility === Window.Maximized) { __dwindow.showNormal() } else if (Window.window.visibility !== Window.FullScreen && - maxOrWindedBtn.active) { + maxOrWindedBtn.visible) { __dwindow.showMaximized() } } - Loader { + WindowButton { objectName: "minimizeBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMinimizeButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMinimizeButtonHint) - active: hasWindowFlag && !__forceHind - visible: active - enabled: (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MINIMIZE) - - sourceComponent: WindowButton { - icon.name: "window_minimize" - textColor: control.textColor - - onClicked:{ - __dwindow.showMinimized() - } + + icon.name: "window_minimize" + textColor: control.textColor + + visible: hasWindowFlag && !__forceHind + enabled: __canMinimize + + onClicked: { + __dwindow.showMinimized() } } - Loader { + WindowButton { objectName: "quitFullBtn" - active: !(!control.fullScreenButtonVisible || - !__dwindow.enabled || - Window.window.visibility !== Window.FullScreen) - visible: active - sourceComponent: WindowButton { - icon.name: "window_quit_full" - textColor: control.textColor - - onClicked: { - if (Window.window.visibility === Window.FullScreen) { - __dwindow.showNormal() - } else { - __dwindow.showFullScreen() - } + + icon.name: "window_quit_full" + textColor: control.textColor + + visible: !(!control.fullScreenButtonVisible || + !__dwindow.enabled || + Window.window.visibility !== Window.FullScreen) + + onClicked: { + if (Window.window.visibility === Window.FullScreen) { + __dwindow.showNormal() + } else { + __dwindow.showFullScreen() } } } - Loader { + WindowButton { id: maxOrWindedBtn; objectName: "maxOrWindedBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMaximizeButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMaximizeButtonHint) - readonly property size maxSize: Qt.size(Window.window.maximumWidth, Window.window.maximumHeight) - readonly property size minSize: Qt.size(Window.window.minimumWidth, Window.window.minimumHeight) - active: (hasWindowFlag && !__forceHind && - (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE) && - maxSize != minSize) - visible: active - enabled: ((__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE) && - (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE)) - - sourceComponent: WindowButton { - property bool isMaximized: Window.window.visibility === Window.Maximized - icon.name: isMaximized ? "window_restore" : "window_maximize" - textColor: control.textColor - onClicked: maxOrWinded() - } + // 使用简单值比较代替对象创建,避免性能开销 + readonly property bool __sizeResizable: (Window.window.maximumWidth !== Window.window.minimumWidth || + Window.window.maximumHeight !== Window.window.minimumHeight) + + property bool isMaximized: Window.window.visibility === Window.Maximized + icon.name: isMaximized ? "window_restore" : "window_maximize" + textColor: control.textColor + onClicked: maxOrWinded() + + visible: (hasWindowFlag && !__forceHind && __canResize && __sizeResizable) + enabled: (__canMaximize && __canResize) } - Loader { + WindowButton { objectName: "closeBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowCloseButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowCloseButtonHint) - active: hasWindowFlag && __dwindow.enabled - visible: active - enabled: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE - - sourceComponent: WindowButton { - icon.name: "window_close" - textColor: control.textColor - onClicked: Window.window.close() - } + + icon.name: "window_close" + textColor: control.textColor + + visible: hasWindowFlag && __dwindow.enabled + enabled: __canClose + + onClicked: Window.window.close() } }