读书人

怎么在Qt和QML之间建立信号槽链接

发布时间: 2012-09-27 11:11:17 作者: rapoo

如何在Qt和QML之间建立信号槽链接
下面的例子讲述了在Qt和QML代码之间建立信号槽链接。这里需要注意:由于QML中的函数是JavaScript,这些函数的参数是没有类型的。
在建立信号槽时需要使用QVariant类型。

myclass.h

#ifndef MYCLASS_H#define MYCLASS_H?#include <QObject>#include <QVariant>?class MyClass : public QObject{    Q_OBJECT?public:    MyClass() {}?public slots:    void getData() {        QString text("New data");        emit data(QVariant(text));    }?signals:    void data(QVariant data);};?#endif // MYCLASS_H

main.cpp

#include <QApplication>#include <QGraphicsObject>#include <QDeclarativeView>#include <myclass.h>?int main(int argc, char *argv[]){    QApplication app(argc, argv);?    MyClass myClass;?    QDeclarativeView view;    view.setSource(QUrl("./ui.qml"));    view.setResizeMode(QDeclarativeView::SizeRootObjectToView);?    QObject *rootObject = dynamic_cast<QObject*>(view.rootObject());?    QObject::connect(rootObject, SIGNAL(dataRequired()), &myClass, SLOT(getData()));    QObject::connect(&myClass, SIGNAL(data(QVariant)), rootObject, SLOT(updateData(QVariant)));?#if defined(Q_WS_MAEMO_5)    view.setGeometry(QRect(0,0,800,480));    view.showFullScreen();#elif defined(Q_WS_S60)    view.setGeometry(QRect(0,0,640,360));    view.showFullScreen();#else    view.setGeometry(QRect(100,100,800, 480));    view.show();#endif?    return app.exec();}

ui.qml

// ui.qmlimport Qt 4.7?Rectangle {    signal dataRequired;?    function updateData(text) { dataText.text = text }  // slot?    anchors.fill: parent; color: "black"?    Text {        id: dataText        anchors.centerIn: parent; color: "white"    }?    MouseArea {        anchors.fill: parent        onClicked: dataRequired()    }}在这个例子中,我们在Qt和QML之间建立了双向链接,当rootObject的信号 dataRequired触发时,myClassgetData被调用;当myClass的信号data触发时, rootObjectupdateData被调用

来源:http://www.thisisqt.com/?action-viewnews-itemid-10

读书人网 >编程

热点推荐