QT5发布,最大的变化就是qml版本的升级,扩展了大量的方法,可见QT官方对qml的重视. qml有着传统脚本语言不具备的优势,语法看来像CSS,支持javascript函式调用. 该脚本能与C++进行交互,这是一般脚本所不能的.可以用来方便编写系统控制脚本,无需编译,直接运行. qml原型其实就是QSA(QT4前发布一个js脚本语言,bug比较多,后废弃了. QT4.7后才出现qml)
一. 导入JS代码
qml 通过代码 import "xxx.js" as xx 导入,下面实现定时打印当前时间
testTimer.js
// qml不支持setTimeout(),只支持Timer
// 打印当前时间
function showTime() {
var today=new Date();
var year=today.getFullYear();
var month=today.getMonth();
var day=today.getDate();
var hour=today.getHours();
var min=today.getMinutes();
var sec=today.getSeconds();
console.log("current: "+year+"-"+month+"-"+day+" "+hour+":"+min+":"+sec);
}
main.qml
import QtQuick 1.1
import "testTimer.js" as TestTimer // 导入js脚本
Rectangle {
width: 360
height: 360
color: "green"
// 启动定时器,打印当前时间
Timer{
id:aTimer
running:true
repeat:true
interval:1000
onTriggered: TestTimer.showTime(); // 调用js显示时间函数
}
}
二. 调用C++方法
将C++对象方法加上Q_INVOKABLE 或者声明为槽,都可以被qml访问到
// MyObject.h
class MyObject:public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QDateTime getCurTime();
public slots:
void showMsg();
};
// main.cpp
// C++工具方法
MyObject myobj;
// 启动脚本解释器
QDeclarativeView *view = new QDeclarativeView;
viewer.rootContext()->setContextProperty("myobj",&myobj); // 注入C++对象
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();
// main.qml
MouseArea {
anchors.fill: parent
onClicked: {
// 调用c++方法
var s=Qt.formatDateTime(myobj.getCurTime(),"yyyy-MM-dd hh:mm:ss");
console.debug("current: "+s);
// 调用c++槽
myobj.showMsg();
console.log('I will quit')
Qt.quit();
}
三. 使用C++自定义对象
qml可以使用c++自定义对象,处理自定义对象信号
// PieChart.h
// 扩展qml对象,显示一饼图
class PieChart:public QDeclarativeItem
{
Q_OBJECT
// 导出name,color属性供qml访问
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
PieChart(QDeclarativeItem *parent=0);
QString name() const;
void setName(const QString &name);
QColor color() const;
void setColor(const QColor &col);
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
Q_INVOKABLE void clearChart();
signals:
void chartCleared(); // 清空图像,在qml处理该信号
private:
QString m_name;
QColor m_color;
};
通过qmlRegisterType() 注册自定义c++对象
// 注册自定义对象,主版本号1,次版本号0,在qml通过名称PieChart访问
qmlRegisterType<PieChart>("Charts",1,0,"PieChart");
调用:
import QtQuick 1.1
import Charts 1.0 // 导入自定义c++对象
Rectangle {
width: 360
height: 360
color: "green"
Text {
text: qsTr("Hello World")
anchors.horizontalCenter: parent.horizontalCenter
}
// 显示自定义饼图,lupdate提取翻译文字因不识别自定义对象,会报错
PieChart{
id: pieChart
color:"red"
width: 300; height:300
anchors.centerIn: parent
onChartCleared: { // 处理自定义对象信号
var msg=qsTr("The chart has been cleared");
console.log(msg);
}
}
}
运行截图: