2014-09-24 115 views
1

。每个选项卡都有Item元素(其中包含其他内容)。我需要从一个选项卡发送信号并在其他选项卡中捕捉(处理)它。如何在TabView(Qt5)的选项卡之间发送信号我有两个选项卡的TabView TabView(Qt5)

如果我尝试从一个选项卡(项目)发送信号到其他 - 它不工作,没有显示任何错误。

我发现了一种方法来发送信号从标签到TabView范围使用连接写在这里(http://qt-project.org/doc/qt-5/qml-qtquick-loader.html)。

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

signal message() 

请在该选项卡上的呼叫(在onClicked处理程序的例子吗?):

onClicked: { 
    nameOfItemInFirstTab.message() 
} 

在TabView的范围,我宣布连接:

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

使用这种方式,可以从第一个选项卡中捕获信号。但是,现在如何将信号发送到第二个标签?还有另一种方法可以做到吗?

回答

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() 
       } 
      } 
     } 
    } 
} 

的功能当然可以任意命名;我只用“on”作为前缀,因为这是信号处理程序名称的约定。请参考Connecting Signals to Methods and Signals


是否有可能使一个onTab1Signal()项?我需要发送一些信息(String/int)到tab2的Item的元素。

是的,但它有点棘手。首先,请记住TabLoader,因此您在其中声明的Item可能并不总是有效。实际上,如果您查看implementation of Tab,您会发现它将其active属性设置为false,这实际上意味着只有在该选项卡已设为最新(名为lazy loading的设计)之后才加载选项卡内容。一个天真的执行(我。Ë我第一次尝试:P)会遇到奇怪的错误,所以你必须:

  1. 在每个Tab设置activetrue,或
  2. 补充一点,占本

的中间项第一种解决方案是最简单的:

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,第二个标签没有装载在启动时,所以直到它是由电流也不会接收第一选项卡的信号(即通过点击它)。也许这对你是可以接受的,所以我也记录了这个解决方案。

+0

查看我更新的答案。 :) – Mitch 2014-09-24 13:23:36

+1

非常感谢您的更新,它帮助我设定了我的工作:) – alr 2014-09-26 13:48:14

相关问题