我有两个标签的TabView。每个选项卡都有Item元素(包含其他内容)。我需要从一个标签发送信号,并在其他标签中捕捉(处理)它。
如果我尝试从一个标签(项目)向其他标签发送信号 - 它不起作用,没有显示任何错误。
我找到了一种方法,可以使用此处写的Connections(http://qt-project.org/doc/qt-5/qml-qtquick-loader.html)将信号从制表符发送到TabView范围。
在第一个标签信号中声明:
signal message()
在此标签中拨打电话(例如,在onClicked处理程序中):
onClicked: {
nameOfItemInFirstTab.message()
}
在TabView范围内,我声明了Connections:
Connections {
target: nameOfTheFirstTab.item
onMessage:
{
doSomething()
}
}
使用这种方式,可以从第一个标签中捕获信号。但是,现在如何向第二个标签发送信号?还有其他办法吗?
答案 0 :(得分:4)
你可以这样做:
import QtQuick 2.3
import QtQuick.Controls 1.2
Rectangle {
id: myRect
width: 100
height: 100
TabView {
anchors.fill: parent
Component.onCompleted: {
tab1.tab1Signal.connect(tab2.onTab1Signal)
tab2.tab2Signal.connect(tab1.onTab2Signal)
}
Tab {
id: tab1
title: "Tab 1"
signal tab1Signal
function onTab2Signal() {
print("Tab 1 received Tab 2's signal")
}
Item {
Button {
text: "Send signal"
anchors.centerIn: parent
onClicked: tab1Signal()
}
}
}
Tab {
id: tab2
title: "Tab 2"
signal tab2Signal
function onTab1Signal() {
print("Tab 2 received Tab 1's signal")
}
Item {
Button {
text: "Send signal"
anchors.centerIn: parent
onClicked: tab2Signal()
}
}
}
}
}
这些功能当然可以命名为任何东西;我只用""在#34;上做了前缀。因为那是信号处理程序名称的惯例。
有关在QML中连接信号的更多信息,请参阅Connecting Signals to Methods and Signals。
是否可以在Item中创建onTab1Signal()?我需要将一些信息(String / int)发送到tab2的Item的元素。
是的,但它有点棘手。首先,请记住Tab是Loader,因此在其中声明的Item
可能并非总是有效。事实上,如果您查看implementation of Tab,您会发现它将active
属性设置为false
,这实际上意味着只有在该标签被填充后才会加载标签内容当前(一种名为lazy loading的设计)。一个天真的实现(即我的第一次尝试:p)将遇到奇怪的错误,所以你必须:
active
或{/ li>中将true
设为Tab
第一个解决方案是最简单的:
import QtQuick 2.3
import QtQuick.Controls 1.2
Rectangle {
id: myRect
width: 100
height: 100
TabView {
id: tabView
anchors.fill: parent
Component.onCompleted: {
tab1.tab1Signal.connect(tab2Item.onTab1Signal)
tab2.tab2Signal.connect(tab1Item.onTab2Signal)
}
// You can also use connections if you prefer:
// Connections {
// target: tab1
// onTab1Signal: tabView.tab2Item.onTab1Signal()
// }
// Connections {
// target: tab2
// onTab2Signal: tabView.tab1Item.onTab2Signal()
// }
property alias tab1Item: tab1.item
property alias tab2Item: tab2.item
Tab {
id: tab1
title: "Tab 1"
active: true
signal tab1Signal
Item {
id: tab1Item
function onTab2Signal() {
print("Tab 1 received Tab 2's signal")
}
Button {
text: "Send signal"
anchors.centerIn: parent
onClicked: tab1Signal()
}
}
}
Tab {
id: tab2
title: "Tab 2"
active: true
signal tab2Signal
Item {
function onTab1Signal() {
print("Tab 2 received Tab 1's signal")
}
Button {
text: "Send signal"
anchors.centerIn: parent
onClicked: tab2Signal()
}
}
}
}
}
第二种解决方案稍微困难一些,并提出警告:
import QtQuick 2.3
import QtQuick.Controls 1.2
Rectangle {
id: myRect
width: 100
height: 100
TabView {
id: tabView
anchors.fill: parent
QtObject {
id: signalManager
signal tab1Signal
signal tab2Signal
}
property alias tab1Item: tab1.item
property alias tab2Item: tab2.item
Tab {
id: tab1
title: "Tab 1"
signal tab1Signal
onLoaded: {
tab1Signal.connect(signalManager.tab1Signal)
signalManager.tab2Signal.connect(tab1.item.onTab2Signal)
}
Item {
id: tab1Item
function onTab2Signal() {
print("Tab 1 received Tab 2's signal")
}
Button {
text: "Send signal"
anchors.centerIn: parent
onClicked: tab1Signal()
}
}
}
Tab {
id: tab2
title: "Tab 2"
signal tab2Signal
onLoaded: {
tab2Signal.connect(signalManager.tab2Signal)
signalManager.tab1Signal.connect(tab2.item.onTab1Signal)
}
Item {
function onTab1Signal() {
print("Tab 2 received Tab 1's signal")
}
Button {
text: "Send signal"
anchors.centerIn: parent
onClicked: tab2Signal()
}
}
}
}
}
由于active
未设置为true
,因此第二个标签在启动时未加载,因此无法收到第一个标签页信号直到它变为当前(即通过点击它)。也许这对你来说是可以接受的,所以我也记录了这个解决方案。