Posted on 2011-08-04 22:05
RTY 閱讀(1677)
評論(2) 編輯 收藏 引用 所屬分類:
轉(zhuǎn)載隨筆 、
QML
1.這里主要是介紹,如何在c++中調(diào)用QML中的函數(shù)和設(shè)置QML中的屬性的問題
2.具體代碼
// UICtest.qml
import Qt 4.7
Rectangle {
id: mainWidget;
width: 640
height: 480
function callbyc(v)
{
mainWidget.color = v;
return "finish";
}
Rectangle{
id: secondRect;
x: 100;
y: 20;
width: 400;
height: 300;
Rectangle{
x: 10;
y: 20;
width: 30;
height: 40;
color: "#FF035721"
Text {
objectName: "NeedFindObj";
anchors.fill: parent;
text: "";
}
}
}
} |
// main.cpp
#include <QtGui/QApplication>
#include <QtDeclarative/QDeclarativeView>
#include <QtDeclarative/QDeclarativeEngine>
#include <QtDeclarative/QDeclarativeComponent>
#include <QtDeclarative/QDeclarativeContext>
#include <QtDeclarative/QDeclarativeItem>
#include <QMetaObject>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDeclarativeView qmlView;
qmlView.setSource(QUrl::fromLocalFile("../UICtest/UICtest.qml"));
qmlView.show();
// 獲取根節(jié)點,就是 QML中 id是mainWidget的節(jié)點
QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(qmlView.rootObject());
item->setProperty("color", QVariant("blue"));
// 查找到我們需要的節(jié)點根均objectname NeedFindObj 來獲得,并設(shè)置他的文本屬性
QDeclarativeItem *item1 = item->findChild<QDeclarativeItem *>("NeedFindObj");
if (item1)
{
item1->setProperty("text", QVariant("OK"));
}
// 調(diào)用QML中的函數(shù), 分別是 函數(shù)所在的對象, 函數(shù)名,返回值, 參數(shù)
QVariant returnVar;
QVariant arg1 = "blue";
QMetaObject::invokeMethod(item, "callbyc",
Q_RETURN_ARG(QVariant, returnVar),Q_ARG(QVariant, arg1));
qDebug(" %s",returnVar.toString().toLocal8Bit().data());
return a.exec();
} |
說明:
這里的根節(jié)點是id為mainWidget的矩形元素,那么在C++中獲取根節(jié)點后就可以,直接的設(shè)置他的屬性了。其他屬性也可以同樣,調(diào)用指定節(jié)點內(nèi)的函數(shù)是通過QMetaObject中的invokeMethod 來進行調(diào)用的。
最后所有關(guān)于QML和c++交互部分就基本寫完,如果想要更多的東西,或者一些其他方法,強烈看看
http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html,或者幫助文檔,(究竟是不是我的文檔里面沒有還是怎么的)