Qml 如何在TabView的选项卡之间发送信号(Qt5)

Qml 如何在TabView的选项卡之间发送信号(Qt5),qml,qt5,Qml,Qt5,我有两个选项卡的选项卡视图。每个选项卡都有Item元素(其中包含其他内容)。我需要从一个选项卡发送信号,并在另一个选项卡中捕获(处理)它 如果我试图从一个选项卡(项目)向另一个选项卡(项目)发送信号,它将不起作用,并且不会显示任何错误 我找到了一种方法,可以使用此处所述的连接()将信号从tab发送到TabView范围 在第一个选项卡信号中声明: signal message() 在此选项卡中进行调用(例如,在onClicked处理程序中): 在选项卡视图范围中,我声明了连接: Connecti

我有两个选项卡的选项卡视图。每个选项卡都有Item元素(其中包含其他内容)。我需要从一个选项卡发送信号,并在另一个选项卡中捕获(处理)它

如果我试图从一个选项卡(项目)向另一个选项卡(项目)发送信号,它将不起作用,并且不会显示任何错误

我找到了一种方法,可以使用此处所述的连接()将信号从tab发送到TabView范围

在第一个选项卡信号中声明:

signal message()
在此选项卡中进行调用(例如,在onClicked处理程序中):

在选项卡视图范围中,我声明了连接:

Connections {
    target: nameOfTheFirstTab.item
    onMessage:
    {
        doSomething()
    }
}

使用这种方式,可以捕获第一个选项卡中的信号。但是,现在,如何向第二个标签发送信号呢?还有其他方法吗?

您可以这样做:

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()
                }
            }
        }
    }
}
当然,这些函数可以命名为任何名称;我只在它们前面加上“on”,因为这是信号处理程序名称的惯例

有关在QML中连接信号的更多信息,请参阅


是否可以在项目中创建onTab1Signal()?我需要将一些信息(String/int)发送到tab2项的元素

是的,但是有点棘手。首先,请记住这是一个,因此在其中声明的
项可能并不总是有效的。事实上,如果您查看,您将看到它将其
active
属性设置为
false
,这实际上意味着只有在该选项卡变为当前选项卡后才能加载选项卡内容(称为。天真的实现(即我的第一次尝试:p)将遇到奇怪的错误,因此您必须:

  • 将每个
    选项卡中的
    活动
    设置为
    真实
    ,或
  • 添加一个说明此问题的中间项
  • 第一个解决方案是最简单的:

    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
    ,因此第二个选项卡在启动时不会加载,因此在第一个选项卡变为当前选项卡(即单击它)之前,它不会接收第一个选项卡的信号。也许这对您来说是可以接受的,所以我也记录了这个解决方案。

    您可以这样做:

    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()
                    }
                }
            }
        }
    }
    
    当然,这些函数可以命名为任何名称;我只在它们前面加上“on”,因为这是信号处理程序名称的惯例

    有关在QML中连接信号的更多信息,请参阅


    是否可以在项目中创建onTab1Signal()?我需要将一些信息(String/int)发送到tab2项的元素

    是的,但是有点棘手。首先,请记住这是一个,因此在其中声明的
    项可能并不总是有效的。事实上,如果您查看,您将看到它将其
    active
    属性设置为
    false
    ,这实际上意味着只有在该选项卡变为当前选项卡后才能加载选项卡内容(称为。天真的实现(即我的第一次尝试:p)将遇到奇怪的错误,因此您必须:

  • 将每个
    选项卡中的
    活动
    设置为
    真实
    ,或
  • 添加一个说明此问题的中间项
  • 第一个解决方案是最简单的:

    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
    ,因此第二个选项卡在启动时不会加载,因此在第一个选项卡变为当前选项卡(即单击它)之前,它不会接收第一个选项卡的信号。也许你可以接受,所以我也记录了这个解决方案。

    非常感谢更新,它帮助我启动了工作:)非常感谢更新,它帮助我启动了工作:)