详解QML 调用 C++ 中的内容

 更新时间:2022年10月31日 08:33:39   作者:englyf八戒  
这篇文章主要介绍了QML 怎么调用 C++ 中的内容,这里主要是总结一下,怎么在 QML 文件中引用 C ++ 文件里定义的内容,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

先说明一下测试环境

编译器:vs2017x64

开发环境:Qt5.12

这里主要是总结一下,怎么在 QML 文件中引用 C ++ 文件里定义的内容?

很简单,我们可以在 C ++ 文件中通过 QML 引擎(QQmlEngine class)的上下文对象(QQmlContext)调用方法 setContextProperty 设置对应的引用即可。详情看看下面的方法声明:

void QQmlContext::setContextProperty(const QString &name, QObject *value);
void QQmlContext::setContextProperty(const QString &name, const QVariant &value);

可以看到,既可以设置 QObject 类型的对象(指针),也可以设置 QVariant 兼容的类型数据(包括基本类型数据等)到 QML 引擎的上下文中。然后在 QML 中就可以通过引用名 name 直接调用即可。

1. 设置类型数据

// main.cpp
#include <QDateTime>
void main() {
    //...
    QQmlEngine engine;
    QDateTime dateTime = QDateTime::currentDateTime();
    engine.rootContext()->setContextProperty("dateTime", &dateTime);
    //...
}

以上代码中直接将 QDateTime 类型的数据设置到引擎上下文中。

Rectangle {
    id: window
    //...
    Text {
      text: dateTime
    }
}

通过引用名 dateTime 将 C ++ 文件中的数据绑定到组件 Text 的 text 属性上,进而显示出来。

2. 设置对象指针

上面是设置数据,这里设置的是 QObject 类型的指针,所以在 QML 里还可以调用 C ++ 文件中定义的对象,包括属性和方法等。

首先,定义一个 QObject 的派生类 ApplicationData,从 QObject 派生是必须的。

// applicationdata.h
#include <QObject>
#include <QDateTime>
#include <QTimer>

class ApplicationData : public QObject
{
    Q_OBJECT

public:
    ApplicationData(){
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &ApplicationData::slt_timeout);
        timer->start(1000);
    }

    Q_INVOKABLE QDateTime getCurrentDateTime() const {
        return m_currentDateTime;
    }

signals:
    void sig_dataTimeUpdated();

private slots:
    void slt_timeout() {
        m_currentDateTime = QDateTime::currentDateTime();
        emit sig_dataTimeUpdated();
    }

private:
    QDateTime m_currentDateTime;
};

其中 Q_INVOKABLE 用于声明此方法可被元对象系统调用。这个类实现每 1000 ms 刷新内部日期时间属性,并且发射信号 sig_dataTimeUpdated,此属性值可以通过调用定义的公共方法 getCurrentDateTime() 得到。

下面再来定义程序入口文件:

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "applicationdata.h"

int main(int argc, char *argv[])
{
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    ApplicationData data;
    engine.rootContext()->setContextProperty("currentDateTime", &data);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

在 QML 引擎装载 QML 文件前,先将类 ApplicationData 的对象指针设置到上下文中。

下面再看看怎么调用指针对应的类对象。

// main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.VirtualKeyboard 2.4

Window {
    id: window
    visible: true
    title: qsTr("Hello World")

    Text {
        id: name_id
        anchors.centerIn: parent
    }

    Connections {
        target: currentDateTime
        onSig_dataTimeUpdated: {
            name_id.text = currentDateTime.getCurrentDateTime();
        }
    }
}

使用 Connections 连接数据对象 currentDateTime 的信号,当指针对象的信号 sig_dataTimeUpdated 发射出来时,调用方法 getCurrentDateTime() 并用结果设置组件 Text 的属性 text。
显示的效果是动态刷新时间日期数据的,这和在上下文中设置类型数据不同(不会刷新),如下图:

到此这篇关于QML 怎么调用 C++ 中的内容?的文章就介绍到这了,更多相关QML调用 C++内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入分析C++派生类中的保护成员继承

    深入分析C++派生类中的保护成员继承

    这篇文章主要介绍了C++派生类中的保护成员继承,深入对C++面向对象编程的继承机制进行了解析,需要的朋友可以参考下
    2015-09-09
  • 详细分析Android中实现Zygote的源码

    详细分析Android中实现Zygote的源码

    这篇文章主要介绍了详细分析Android中实现Zygote的源码,包括底层的C/C++代码以及Java代码部分入口,需要的朋友可以参考下
    2015-07-07
  • 一般函数指针和类的成员函数指针深入解析

    一般函数指针和类的成员函数指针深入解析

    以下是对一般函数指针和类的成员函数指针进行了介绍。需要的朋友可以过来参考下
    2013-08-08
  • Linux C/C++实现显示NIC流量统计信息

    Linux C/C++实现显示NIC流量统计信息

    NIC流量统计信息是由操作系统维护的,当数据包通过NIC传输时,操作系统会更新相关的计数器,通过读取这些计数器,我们可以获得关于网络流量的信息,下面我们就来学习一下如何通过C/C++实现显示NIC流量统计信息吧
    2024-01-01
  • C/C++从零开始的cmake教程

    C/C++从零开始的cmake教程

    今天小编就为大家分享一篇关于C/C++从零开始的cmake教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 解析C++中指向对象的指针使用

    解析C++中指向对象的指针使用

    这篇文章主要介绍了解析C++中指向对象的指针使用,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 实例讲解在C++的函数中变量参数及默认参数的使用

    实例讲解在C++的函数中变量参数及默认参数的使用

    这篇文章主要介绍了在C++的函数中变量参数及默认参数的使用,是C++函数入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C语言零基础入门(1)

    C语言零基础入门(1)

    这篇文章主要为大家详细介绍了C语言零基础入门的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • String类的写时拷贝实例

    String类的写时拷贝实例

    下面小编就为大家带来一篇String类的写时拷贝实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 带你粗略了解C++流的读写文件

    带你粗略了解C++流的读写文件

    这篇文章主要为大家总结了C++中输入输出流及文件流操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08

最新评论