QT QML切换页面时隐藏button_1按钮失效问题求助
问题:切换到SwipeView第二页时隐藏按钮不生效
需求:从第一页导航到第二页时隐藏button_1,但添加button_1.visible: false语句后未生效。相关代码如下:
main.qml
import QtQuick 2.15 import QtMultimedia 5.0 import QtQuick.Controls 2.15 import QtQuick.Dialogs 1.0 import QtQuick.Layouts 1.2 import Qt.labs.folderlistmodel 2.1 ApplicationWindow{ title : qsTr("Swipe view") visible: true width : 800 height: 480 color: "black" /*------------------------- Swipe View -------------------------*/ SwipeView { id: swipeView currentIndex: swipeView.currentIndex anchors.fill: parent Item { id: id_page_1 Text { color: "white" text: qsTr("Page_1") } } Item { id: id_page_2 Text { color: "white" text: qsTr("Page_2") } visible: id_page_2.visible button_1.visible: false } } /*------------------------- BOTTOM BAR-------------------------*/ Rectangle{ id: id_toolButton width : parent.height/1.2 height: 80 x: parent.width/4 y: parent.height-height color: "white" visible: true opacity: 0.5 Row { id: rowToolButton anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter Button { id: button_1 visible : button_1.visible width: 60 height: 60 background: Rectangle { color: "transparent" } Image { anchors.centerIn: parent; width: parent.width/1.25 height: parent.height/1.25 source: "icons/image_1.png" } } } } }
main.py
import sys import os from PySide2.QtQml import * from PySide2.QtGui import * from PySide2 import QtCore def qt_message_handler(mode, context, message): if mode == QtCore.QtInfoMsg: mode = 'Info' elif mode == QtCore.QtWarningMsg: mode = 'Warning' elif mode == QtCore.QtCriticalMsg: mode = 'critical' elif mode == QtCore.QtFatalMsg: mode = 'fatal' else: mode = 'Debug' print("%s: %s (%s:%d, %s)" % (mode, message, context.file, context.line, context.file)) if __name__ == "__main__": os.environ["QT_QUICK_BACKEND"] = "software" QtCore.qInstallMessageHandler(qt_message_handler) application = QGuiApplication(sys.argv) engine = QQmlApplicationEngine() engine.load(os.path.join(os.path.dirname(__file__),"application.qml")) if not engine.rootContext(): sys.exit(-1) try : sys.exit(application.exex_()) except: pass
解决方法
问题根源
- 作用域错误:
button_1属于底部栏控件,不在id_page_2的作用域内,直接在id_page_2里修改button_1.visible不符合QML规则,完全无效。 - 循环绑定:
button_1的visible: button_1.visible是自引用循环绑定,会导致属性值无法正常更新。 - 无效代码:
id_page_2中的visible: id_page_2.visible同样是无意义的循环绑定。
修改后的main.qml
import QtQuick 2.15 import QtMultimedia 5.0 import QtQuick.Controls 2.15 import QtQuick.Dialogs 1.0 import QtQuick.Layouts 1.2 import Qt.labs.folderlistmodel 2.1 ApplicationWindow{ title : qsTr("Swipe view") visible: true width : 800 height: 480 color: "black" /*------------------------- Swipe View -------------------------*/ SwipeView { id: swipeView anchors.fill: parent Item { id: id_page_1 Text { color: "white" text: qsTr("Page_1") } } Item { id: id_page_2 Text { color: "white" text: qsTr("Page_2") } } } /*------------------------- BOTTOM BAR-------------------------*/ Rectangle{ id: id_toolButton width : parent.height/1.2 height: 80 x: parent.width/4 y: parent.height-height color: "white" visible: true opacity: 0.5 Row { id: rowToolButton anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter Button { id: button_1 // 绑定SwipeView索引:第二页(索引1)时隐藏按钮 visible : swipeView.currentIndex !== 1 width: 60 height: 60 background: Rectangle { color: "transparent" } Image { anchors.centerIn: parent; width: parent.width/1.25 height: parent.height/1.25 source: "icons/image_1.png" } } } } }
关键修改说明
- 移除所有循环绑定的无效代码,比如
swipeView.currentIndex: swipeView.currentIndex、visible: id_page_2.visible等。 - 给
button_1的visible属性添加正确绑定:swipeView.currentIndex !== 1,当SwipeView切换到第二页时自动隐藏按钮,其他页面显示。 - 删除
id_page_2内试图修改button_1的无效代码,控件属性控制应该直接在目标控件上通过全局可访问对象(如swipeView)实现。
另外,main.py中有一处笔误:application.exex_()需改为application.exec_(),否则会导致运行报错。
内容的提问来源于stack exchange,提问作者RACHID BEN ABDELMALEK
相关产品推荐
相关产品推荐

