2014-09-24 58 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

相關問題