下面的例子讲述了在Qt和QML代码之间建立信号槽链接。这里需要注意:由于QML中的函数是JavaScript,这些函数的参数是没有类型的。
在建立信号槽时需要使用QVariant类型。
来源: http://www.thisisqt.com/?action-viewnews-itemid-10
在建立信号槽时需要使用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.qml
import 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