在我的Qt应用程序中,我有很多窗口,有时它们需要一个“后退”按钮。此按钮位于ToolBar
的{{1}}中的header
组件上。
我要实现的是,此ApplicationWindow
按钮将仅具有与其他对象的单个连接,即与名为Back
方法的最后一个对象的连接。现在,每个connect
都建立了一个新的连接,当信号发出时,它被多次调用。不幸的是,Qt没有connect
方法,如果可以解决我的问题,我会先调用disconnectAll
然后再disconnectAll
来实现单一连接。
那么,您如何通过简单的方法在Qt中实现此功能?
这是一个最小的可复制示例,多次单击选项卡,然后按“返回”按钮,您将看到许多connect
消息。我需要的是此消息,以与连接到console.log
按钮的最后一个对象相对应。
Back
PageForm.ui的定义如下
import QtQuick 2.11
import QtQuick.Controls 2.4
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Tabs")
signal back_btn_clicked()
SwipeView {
id: swipeView
anchors.fill: parent
currentIndex: tabBar.currentIndex
Page1Form {
id: page1
function page1_callback() {
console.log("page 1 back button triggered")
}
function install_button() {
enable_back_button(page1_callback)
}
}
Page2Form {
id: page2
function page2_callback() {
console.log("page 2 back button triggered")
}
function install_button() {
enable_back_button(page2_callback)
}
}
function install_back_button(idx) {
if (idx===0) {
page1.install_button()
}
if (idx===1) {
page2.install_button()
}
}
}
Button {
id: btn_back
visible: false
text: "Back Button"
onClicked: back_btn_clicked()
}
footer: TabBar {
id: tabBar
currentIndex: swipeView.currentIndex
TabButton {
text: qsTr("Page 1")
onClicked: swipeView.install_back_button(0)
}
TabButton {
text: qsTr("Page 2")
onClicked: swipeView.install_back_button(1)
}
}
function enable_back_button(func_name) {
btn_back.visible=true
back_btn_clicked.connect(func_name)
}
}
答案 0 :(得分:1)
我认为最简单的技巧是将回调存储在一个属性中,然后在enable_back_button()
中,在您的disconnect()
函数中引用该属性,并使用传递的新回调相应地更新该属性作为函数参数。 (此参数的基本原理是disconnect()
函数必须接受一个参数:断开连接的插槽。因此,我们需要以某种方式对其进行跟踪。) / p>
ApplicationWindow {
visible: true
// ... omitted for brevity
property var prevCallback: null
// ... ofb
function enable_back_button(func_name) {
btn_back.visible=true
if (prevCallback)
back_btn_clicked.disconnect(prevCallback) // disconnect previous callback
back_btn_clicked.connect(func_name) // connect new callback
prevCallback = func_name // update property with new callback
}
}
通过简单地将存储更改为数组,然后对其进行迭代,这也可以在多个连接上工作。