Skip to content

Commit 1d2ad38

Browse files
committed
fix: optimize window button display delay issue
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
1 parent 26c3977 commit 1d2ad38

1 file changed

Lines changed: 53 additions & 55 deletions

File tree

qt6/src/qml/WindowButtonGroup.qml

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -19,92 +19,90 @@ RowLayout {
1919

2020
property var __dwindow: Window.window.D.DWindow
2121
property bool __forceHind: !__dwindow.enabled || embedMode || Window.window.visibility === Window.FullScreen
22+
23+
// 缓存 motifFunctions 位运算结果,避免重复计算
24+
readonly property bool __canMinimize: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MINIMIZE
25+
readonly property bool __canMaximize: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE
26+
readonly property bool __canResize: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE
27+
readonly property bool __canClose: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE
2228

2329
onMaxOrWinded: {
24-
if (!(__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE)) {
30+
if (!__canMaximize) {
2531
return
2632
}
2733

2834
if (Window.window.visibility === Window.Maximized) {
2935
__dwindow.showNormal()
3036
} else if (Window.window.visibility !== Window.FullScreen &&
31-
maxOrWindedBtn.active) {
37+
maxOrWindedBtn.visible) {
3238
__dwindow.showMaximized()
3339
}
3440
}
3541

36-
Loader {
42+
WindowButton {
3743
objectName: "minimizeBtn"
3844
property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMinimizeButtonHint)*/
3945
Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMinimizeButtonHint)
40-
active: hasWindowFlag && !__forceHind
41-
visible: active
42-
enabled: (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MINIMIZE)
43-
44-
sourceComponent: WindowButton {
45-
icon.name: "window_minimize"
46-
textColor: control.textColor
47-
48-
onClicked:{
49-
__dwindow.showMinimized()
50-
}
46+
47+
icon.name: "window_minimize"
48+
textColor: control.textColor
49+
50+
visible: hasWindowFlag && !__forceHind
51+
enabled: __canMinimize
52+
53+
onClicked: {
54+
__dwindow.showMinimized()
5155
}
5256
}
5357

54-
Loader {
58+
WindowButton {
5559
objectName: "quitFullBtn"
56-
active: !(!control.fullScreenButtonVisible ||
57-
!__dwindow.enabled ||
58-
Window.window.visibility !== Window.FullScreen)
59-
visible: active
60-
sourceComponent: WindowButton {
61-
icon.name: "window_quit_full"
62-
textColor: control.textColor
63-
64-
onClicked: {
65-
if (Window.window.visibility === Window.FullScreen) {
66-
__dwindow.showNormal()
67-
} else {
68-
__dwindow.showFullScreen()
69-
}
60+
61+
icon.name: "window_quit_full"
62+
textColor: control.textColor
63+
64+
visible: !(!control.fullScreenButtonVisible ||
65+
!__dwindow.enabled ||
66+
Window.window.visibility !== Window.FullScreen)
67+
68+
onClicked: {
69+
if (Window.window.visibility === Window.FullScreen) {
70+
__dwindow.showNormal()
71+
} else {
72+
__dwindow.showFullScreen()
7073
}
7174
}
7275
}
7376

74-
Loader {
77+
WindowButton {
7578
id: maxOrWindedBtn; objectName: "maxOrWindedBtn"
7679
property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMaximizeButtonHint)*/
7780
Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMaximizeButtonHint)
7881

79-
readonly property size maxSize: Qt.size(Window.window.maximumWidth, Window.window.maximumHeight)
80-
readonly property size minSize: Qt.size(Window.window.minimumWidth, Window.window.minimumHeight)
81-
active: (hasWindowFlag && !__forceHind &&
82-
(__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE) &&
83-
maxSize != minSize)
84-
visible: active
85-
enabled: ((__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE) &&
86-
(__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE))
87-
88-
sourceComponent: WindowButton {
89-
property bool isMaximized: Window.window.visibility === Window.Maximized
90-
icon.name: isMaximized ? "window_restore" : "window_maximize"
91-
textColor: control.textColor
92-
onClicked: maxOrWinded()
93-
}
82+
// 使用简单值比较代替对象创建,避免性能开销
83+
readonly property bool __sizeResizable: (Window.window.maximumWidth !== Window.window.minimumWidth ||
84+
Window.window.maximumHeight !== Window.window.minimumHeight)
85+
86+
property bool isMaximized: Window.window.visibility === Window.Maximized
87+
icon.name: isMaximized ? "window_restore" : "window_maximize"
88+
textColor: control.textColor
89+
onClicked: maxOrWinded()
90+
91+
visible: (hasWindowFlag && !__forceHind && __canResize && __sizeResizable)
92+
enabled: (__canMaximize && __canResize)
9493
}
9594

96-
Loader {
95+
WindowButton {
9796
objectName: "closeBtn"
9897
property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowCloseButtonHint)*/
9998
Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowCloseButtonHint)
100-
active: hasWindowFlag && __dwindow.enabled
101-
visible: active
102-
enabled: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE
103-
104-
sourceComponent: WindowButton {
105-
icon.name: "window_close"
106-
textColor: control.textColor
107-
onClicked: Window.window.close()
108-
}
99+
100+
icon.name: "window_close"
101+
textColor: control.textColor
102+
103+
visible: hasWindowFlag && __dwindow.enabled
104+
enabled: __canClose
105+
106+
onClicked: Window.window.close()
109107
}
110108
}

0 commit comments

Comments
 (0)