2012-02-29 3 views
10

Как я могу отправить сигнал s из одного компонента qml в другой?Как захватить сигнал в QML?

Ниже приведен пример:

Rectangle { 
    id: main 
    width: 360; height: 360 
    signal clicked() 

    Text { 
     id: testStr 
     anchors.centerIn: parent 
     text: "Hello World" 
    } 
    MouseArea { 
     id: mouseArea 
     anchors.fill: parent 
     onClicked: { Qt.quit(); } 
    } 

    Component.onCompleted: clicked() 
    onClicked: testStr.text = "Demo" 
} 

Как захватить сигнал в другом компоненте?

ответ

13

Вы должны использовать метод сигналов компонента (сигналы сами по себе являются объектами).

function clickHandler() { 
    console.log('main clicked') 
} 
Component.onCompleted: { 
    main.clicked.connect(clickHandler) 
} 

См http://developer.qt.nokia.com/doc/qt-4.8/qmlevents.html

+1

Спасибо. Может ли это объяснить, что сигнал (onXXXXX) используется только сам по себе, если хотите, чтобы его записывали в другом, используйте Connecet? –

+0

Да, если вы объявляете экземпляр компонента в вашем qml-файле, вы можете назначить код предварительно определенному слоту onXxx этого компонента. Это уже связано, вы просто привязываете к нему выражение. Если вы хотите подключить сигнал с слотом другого экземпляра или функции, вы должны использовать метод 'connect'. – sergk

+0

Я вижу, Спасибо за помощь .. –

9

В другом объекте вы просто добавляете слово on, за которым следует имя сигнала. EG:

Rectangle { 
    YourQmlObject { 
    onClicked: { ... } 
    } 
} 

(щелкнул несколько запутанным имя сигнала, потому что это общая Но если бы вы назвать ваш сигнал orange, вы бы сделать привязку onOrange:.)

+0

спасибо за вашу помощь. Если есть много «YourQmlObject», тогда я напишу onClicked: {...} в каждом компоненте? Есть другой путь? –

+0

Сигналы будут пропущены, поэтому вы можете поместить свои «лоты» в один контейнер «AllMyQmlObjects», который является длинным списком ваших объектов, и поместите обработчик 'onClicked:' в любой файл, в конце концов содержащий «AllMyQmlObjects». –

+0

Как насчет Connect? –

5

вы можете использовать соединительный элемент QML

Connections { 
target: yourQmlObject 
onClicked: foo(...) 
} 
0

QML

Button{ 
    id: btn_add_pq 
    text: "Add" 
    onClicked: { 
    var component = Qt.createComponent("add_pq.qml") 
    var dialog = component.createObject(root) 
    dialog.open() 

    dialog.accepted.connect(function(){ 
     console.log("ID  :" + window.in_id) 
     console.log("Name :" + window.in_name) 
     console.log("Comment:" + window.in_comment) 
    }) 
    } 
} 

add_pq.qml

Dialog { 
    id:dialog 
    ... 
    property alias in_id: txtID.text 
    property alias in_comment: txtComment.text 
    property alias in_name: txtName.text 
    ... 
    contentItem: GridLayout{ 
    ... 
    TextField{ 
     id: txtComment 
     Layout.alignment: Qt.AlignRight 
    } 
    Button{ 
     Layout.columnSpan: 2 
     text: "Add" 
     Layout.alignment: Qt.AlignRight 
     onClicked: { 
     dialog.click(StandardButton.Save) 
     } 
    } 
    } 
Смежные вопросы