qml与c++交互

     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);
        }
    }
}

 

   运行截图:

   运行结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值