`
tcspecial
  • 浏览: 911551 次
  • 性别: 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++...

    Qt之QML与 C++ 交互.docx

    ### Qt之QML与C++ 交互 #### 方式1:C++对象注册到QML,QML访问...以上就是Qt中QML与C++交互的四种常见方式。通过这些方式,开发者可以在QML和C++之间建立灵活高效的数据交换和功能协作机制,满足不同应用场景的需求。

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

    C++类需要继承自`QObject`或者其子类,并且包含`Q_OBJECT`宏以启用元对象系统,这是QML-C++交互的基础。此外,如果你想让C++的属性在QML中可读写,需要使用`Q_PROPERTY`宏来声明这些属性: ```cpp class MyClass : ...

    QML与c++交互

    QML 与 C++ 交互 QML(Qt Meta Language 或 Qt Modeling Language)是一种基于declarative编程的语言,用于描述用户界面和用户体验。C++ 是一种高性能的编程语言,常用于开发桌面应用程序和移动应用程序。QML 和 ...

    QML与C++交互使用

    ### QML与C++交互使用的深入探讨 #### 一、引言 在现代软件开发领域,特别是GUI应用程序的开发过程中,QML与C++的结合使用成为了一种流行且高效的技术方案。Qt框架通过其强大的功能支持,使得开发者能够轻松地实现...

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

    总结来说,QML与C++的交互是Qt开发的关键部分,而暴露C++方法到QML则提供了一种灵活的机制,让我们能够在UI层面上触发底层的业务逻辑。通过定义Q_INVOKABLE方法、注册QML类型以及在QML中调用这些方法,我们可以创建...

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

    在本文中,我们将深入探讨如何在Qt环境中使用QML与C++进行交互,并解决路径中包含中文字符的问题。QML(Quantum Meta Language)是一种声明式语言,用于创建丰富的用户界面,而C++则是一种强大的面向对象编程语言,...

    QML2与C++交互

    在QML与C++交互的过程中,主要涉及以下几个关键概念: 1. **QQmlEngine**:这是QML的运行时环境,负责解析和加载QML文件,以及管理QML对象的生命周期。 2. **QQmlComponent**:它用于加载和实例化QML文件中的单个...

    qml与C++交互代码

    例如,`untitled33.qml`可能是一个包含QML组件的文件,而`untitled33.cpp/h`则可能是实现了与QML交互的C++类。 总结来说,QML与C++的交互涉及多个层面,包括但不限于:设置上下文属性、动态加载QML组件、注册自定义...

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

    总结来说,QML与C++的交互使得我们在Qt地图开发中能够灵活地管理大量标记,结合QML的声明式语法和C++的高性能处理,可以创建出高效且易于维护的地图应用。同时,这种模式也适用于其他复杂的UI交互和数据驱动的场景。

    QML与C++混合编程.pdf

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

    QML 和C++混合编程宝典.zip_C语言能实现gui编程吗

    4. **QML与C++交互**:在QML中,可以使用`Component.onCompleted`或`Connections`元素来调用C++函数。同时,C++也可以通过`QQmlContext`或`QQmlEngine`的接口访问QML对象。 5. **信号和槽**:利用Qt的信号和槽机制...

    QML 调用 C++列表类型的属性

    首先,我们需要理解QML与C++交互的基础。Qt提供了一个名为`QQmlContext`的类,它可以将C++对象暴露给QML环境。这些对象被称为"上下文属性",QML可以通过它们直接访问C++对象的属性和方法。此外,`QQmlEngine`是QML...

    qml与c++混合编程例子

    C++与QML的交互:`QQmlContext`和`QQmlEngine` 另一种混合编程的方式是通过QML上下文(`QQmlContext`)和QML引擎(`QQmlEngine`)来在QML与C++之间传递数据和调用函数。这包括: - **设置根对象属性**:在C++中,...

    C++和QML交互

    在Qt框架中,C++和QML的交互是构建高效、动态用户界面的关键特性。QML是一种声明式语言,主要用于创建用户界面,而C++则提供了强大的编程能力。以下是如何在QML环境中使用C++对象的详细说明: 1. **在C++中实现一个...

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

    在实际开发中,我们经常需要在C++和QML之间进行数据交互,实现业务逻辑和界面展示的紧密配合。本篇将详细讲解如何在C++与QML之间进行数据通信。 ### 一、C++向QML传递数据 1. **创建Qt对象模型**:首先,你需要...

    Qml与C++通信交互

    本项目"Qml与C++通信交互Demo"旨在展示如何实现这种融合,以便开发者能够更高效地开发跨平台应用。 QML是一种基于JavaScript的轻量级脚本语言,用于描述UI元素和它们的行为。QML的声明式语法允许开发者以简洁的方式...

    TableEdit-0.1.5_qml_C++_

    《TableEdit-0.1.5_qml_C++_:基于QML与C++的高效表格编辑器》 TableEdit-0.1.5是一款基于QML和C++技术开发的表格控件,专为处理JSON文件设计,提供丰富的数据操作功能。这款工具的核心优势在于其灵活的用户界面和...

Global site tag (gtag.js) - Google Analytics