`
tcspecial
  • 浏览: 895894 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

qml与c++交互

    博客分类:
  • QT
阅读更多

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

 

   运行截图:

   运行结果

 

  • 大小: 23.4 KB
分享到:
评论

相关推荐

    QML与C++交互QML与C++交互

    QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++交互QML与C++...

    QML 与 C++交互 - 02 C++暴露方法到QML

    本系列会介绍几种QML与C++进行数据交互的方法,包括信号槽的链接,QML调用C++类的方法等。 本代码为第二篇《QML 与 C++交互 - 02 C++暴露方法到QML》的示例demo

    qml与C++交互代码

    qml与C++交互代码

    QML 与 C++交互 - 01QML访问C++属性

    本系列会介绍几种QML与C++进行数据交互的方法,包括信号槽的链接,QML调用C++类的方法等。 本文为第一篇:QML访问C++属性。可以访问我的博客查看代码解释。

    Qt之QML与 C++ 交互.docx

    1. C++ 对象注册到 QML,QML 访问 C++ 对象; 2. QML 暴露对象给 C++ 进行交互; 3. C++ 创建 QML 对象并进行交互; 4. C++ 对象与 QML 通过信号槽交互。 文档详细描述了四种方式的使用

    QML与c++交互

    QML c++ 的详细介绍 和大量交互例子

    QML与c++交互在地图上增加mark的源代码

    QML与c++交互在地图上增加mark的源代码

    QML与C++交互,解压后路径去掉中文.rar

    博客的相关代码,演示QML与C++的交互。博客地址https://blog.csdn.net/gongjianbo1992/article/details/87965925

    QML2与C++交互

    关于QML与C++交互具体实例,里面涉及QML与C++进行数据交互等功能

    QML与C++交互使用

    我们知道 ,通过Qt Declarative module ,C++可以动态创建和操纵QML的组件(cpmponents) ,我们利用这些API使用C++来拓展我们的QML程序,反过来也可以将QML嵌入到你的C++程序中。通过Qt的元对象系统( Qt‘s meta...

    QML与C++交互

    Qt Quick 是一种高级用户界面技术,使用它可轻松地创建供移动和嵌入式...  研究了几天QML,我想编程人员关心的还是QML怎样与C++ Application交互了。发现网上QT中文资料很少,唉,只能参照官网文档:  一、QML引

    C++和QML交互

    Qt 提供了两种在 QML 环境中使用 C++ 对象的方式: 1. 在 C++ 中实现一个类,注册到 QML 环境中, QML 环境中使用该类型创建对象 2. 在 C++ 中构造一个对象,将这个对象设置为 QML 的上下文属性,在 QML 环境中直接...

    Qml与C++通信交互

    Qml与C++通信交互Demo,只有最简单的Qml界面调用C++类的函数

    Qt Quick之QML与C++交互方法PPT

    Qt Quick技术使得开发者能够快速构建UI,而其所使用的语言...因此QML与C++的交互必然是我们需要掌握的技能。 此次Webinar将向大家介绍QML与C++的交互方式,通过例子来展示应用方法,为我们后续的产品开发提供便利。

    TableEdit-0.1.5_qml_C++_

    使用qml实现的表格控件,支持JSON文件的导入,支持表格的增删改查操作。支持表格的编辑,撤销等操作。同时内嵌搜索功能

    c++与QML相互通信 数据交互

    c++数据传入qml, qml数据返回给c++,数据互传 ,两种方式

    QML与C++混合编程.pdf

    C++与QML的交互是通过注册C++对象给QML环境得以实现的: 在C++实现中,非可视化的型别均为QObject的子类,可视化的类型均为QDeclarativeItem的子类。注意:QDeclarativeItem等同于QML的Item类。 如果用户想要定义...

    QML--实现与HTML的交互

    QML--实现与HTML的交互

    QML C++交互小例子

    1. 把Qt C++中的对象或类型暴露给 QML端,供QML端使用。(官方说法是“嵌入”而非“暴露”,比较文明。- -b) 2. QML中的Signal Handler(相当于Qt C++发送信号给QML端,QML端的Signal Handler进行处理)。 3. 在Qt ...

Global site tag (gtag.js) - Google Analytics