2013-05-04 3 views
0

Я создал приложение Blackberry с помощью мастера с шаблоном NavigationPane и добавил некоторые компоненты в DetailsPage.qml (например, Button и TextField).Cascades NavigationPane: подключиться к сигналу объекта в другой файл qml

Я хочу подключить функцию слота на кнопке в DetailsPage.qml, чтобы при щелчке прочитать текст в TextArea на той же странице.

Моя проблема заключается в том, что при запуске приложения загружаемый qml является main.qml. Если я попытаюсь получить ссылку на объект на DetailsPage.qml findChild, верните 0x0, потому что он не может его найти. Файл main.qml является:

// Navigation pane project template 
import bb.cascades 1.0 

NavigationPane { 
    id: navigationPane 
    Page { 
     // page with a picture thumbnail 
     Container { 
      background: Color.Black 
      layout: DockLayout { 
      } 
      Button {     
       horizontalAlignment: HorizontalAlignment.Center 
       verticalAlignment: VerticalAlignment.Center 
       text: qsTr("New todo") 
       imageSource: "asset:///images/picture1thumb.png" 
       onClicked: { 
        // show detail page when the button is clicked 
        var page = getSecondPage(); 
        console.debug("pushing detail " + page) 
        navigationPane.push(page); 
       } 
       property Page secondPage 
       function getSecondPage() { 
        if (! secondPage) { 
         secondPage = secondPageDefinition.createObject(); 
        } 
        return secondPage; 
       } 
       attachedObjects: [ 
        ComponentDefinition { 
         id: secondPageDefinition 
         objectName: "secondPageDefinition" 
         source: "DetailsPage.qml" 
        } 
       ] 
      } 
     } 
    } 
    onCreationCompleted: { 
     // this slot is called when declarative scene is created 
     // write post creation initialization here 
     console.log("NavigationPane - onCreationCompleted()"); 

     // enable layout to adapt to the device rotation 
     // don't forget to enable screen rotation in bar-bescriptor.xml (Application->Orientation->Auto-orient) 
     OrientationSupport.supportedDisplayOrientation = SupportedDisplayOrientation.All; 
    } 
} 

Файл detailsPage.qml является:

// Navigation pane project template 
import bb.cascades 1.0 

Page { 
    // page with a picture detail 
    id: pgDetail 
    objectName: "pgDetail" 
    actions: [ 
     // create navigation panel actions here 
     ActionItem { 
      title: qsTr("Break") 
      onTriggered: { 
       imgView.imageSource = "asset:///images/picture1br.png" 
      } 
     } 
    ] 
    paneProperties: NavigationPaneProperties { 
     backButton: ActionItem { 
      onTriggered: { 
       // define what happens when back button is pressed here 
       // in this case is closed the detail page 
       navigationPane.pop() 
      } 
     } 
    } 
    Container { 
     background: Color.Black 
     Label { 
      text: qsTr("Page 2") 
      horizontalAlignment: HorizontalAlignment.Center 
      textStyle { 
       base: SystemDefaults.TextStyles.TitleText 
       color: Color.Yellow 
      } 
     } 
     ImageView { 
      id: imgView 
      imageSource: "asset:///images/picture1.png" 
      horizontalAlignment: HorizontalAlignment.Center 
     } 
     Label { 
      text: qsTr("Picture description") 
      horizontalAlignment: HorizontalAlignment.Center 
     } 
     TextArea { 
      objectName: "noteText" 
     } 
     Button { 
      objectName: "insertBtn" 
      text: qsTr("Insert Note") 
     } 
    } 
} 

Я пытался подключить кнопку с помощью сигнала pushTransactionEnded, но у него есть две проблемы:

  1. Метод connect вызывается каждый раз, когда я меняю экран (и я хочу подключить слот только при запуске).
  2. Когда я нажимаю кнопку, у меня такая же проблема, у меня нет ссылки на currentPage (но, возможно, если я сохраню корневую панель в этом случае, используя метод top(), я могу получить доступ к текущему Страница:

В основном мои вопросы: Когда я должен подключить свой слот к сигналу? Как я это делаю, если объекты находятся в другом qml-файле?

Я хочу обработать событие clicked на C++ не непосредственно в qml-файле.

ответ

1

Регистрация C++ объект, содержащий свой слот с QML с помощью setContextProperty и называют этот слот непосредственно из DetailsPage.qml

... 
    Button { 

     objectName: "insertBtn" 
     text: qsTr("Insert Note") 
     onClicked:{ 
      cppObject.mySlot() 
     } 
    } 
    ... 
1

Вы также можете создать псевдоним, как QT

Button { 
    id:first_button 
    text: "original text" 
    onCreationComplete{ 
     Qt.first_qml_fitst_button = first_button 
    }    
} 

и на второй форме, вы можете имеют

Button { 
    id:second_button 
    onClicked:{ 
     Qt.first_qml_fitst_button.text = "i change text" 
    } 
}