如何在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_Hmain.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触发时,myClass的 getData被调用;当myClass的信号data触发时, rootObject的updateData被调用来源:http://www.thisisqt.com/?action-viewnews-itemid-10