Qt(Qml)如何在窗口加载前根据用户权限设置组件可见性
Qt Quick 权限控制组件闪烁问题解决方案(适配Qt 5.15.2)
问题原因
你使用的onSceneGraphInitialized触发时机过晚,此时QML场景已经完成初始化、准备渲染第一帧,组件默认可见性为true会被先渲染出来,随后修改visible属性就会出现短暂闪烁的问题。
方案1:声明式属性绑定(最推荐)
QML原生支持声明式绑定,不需要等到信号触发再命令式修改属性,直接把组件的visible属性和权限判断逻辑绑定即可,组件初始化时就会用判断结果作为初始值,完全不会出现闪烁:
Window { id: window width: Screen.desktopAvailableWidth / 1.7 height: Screen.desktopAvailableHeight / 1.7 visible: true Button { id: add_new_user_button // 直接绑定可见性:仅等级为2的用户可见 visible: setting_check.get_user_level_int() === 2 // 其余按钮属性配置 } }
如果权限值会在运行过程中变更,可将C++侧的用户等级封装为带NOTIFY信号的Q_PROPERTY,绑定会自动随值更新,无需手动修改属性。
方案2:提前配置属性后再显示窗口
如果业务逻辑必须使用命令式修改属性,可先将窗口默认可见性设为false,完成权限判断、所有组件可见性配置后再显示窗口:
Window { id: window width: Screen.desktopAvailableWidth / 1.7 height: Screen.desktopAvailableHeight / 1.7 visible: false // 默认不显示窗口 Component.onCompleted: { // 组件实例化完成后先处理权限逻辑 if (Glob_vals.login_instance === true && setting_check.get_user_level_int() !== 2) { Glob_vals.login_instance = false add_new_user_button.visible = false } // 所有属性修改完成后再显示窗口 window.visible = true } }
Component.onCompleted触发时机早于onSceneGraphInitialized,此时还未启动任何渲染操作,修改完属性再显示窗口不会产生闪烁。
方案3:状态管理多权限界面(适配3级权限场景)
你有3个不同的授权等级,用QML的State管理不同权限的界面状态会更易维护:
Window { id: window width: Screen.desktopAvailableWidth / 1.7 height: Screen.desktopAvailableHeight / 1.7 visible: true property int userLevel: setting_check.get_user_level_int() states: [ State { name: "level1" when: window.userLevel === 1 PropertyChanges { target: add_new_user_button; visible: false } // 其余等级1用户的界面属性配置 }, State { name: "level2" when: window.userLevel === 2 PropertyChanges { target: add_new_user_button; visible: true } // 其余等级2用户的界面属性配置 }, State { name: "level3" when: window.userLevel === 3 // 等级3用户的界面属性配置 } ] }
内容的提问来源于stack exchange,提问作者Emre İriş
相关产品推荐
相关产品推荐

