首页 > 编程语言 >QML 怎么调用 C++ 中的内容?

QML 怎么调用 C++ 中的内容?

时间:2022-10-31 02:44:06浏览次数:67  
标签:engine include C++ 调用 QML QDateTime currentDateTime

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ


先说明一下测试环境

编译器: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。
显示的效果是动态刷新时间日期数据的,这和在上下文中设置类型数据不同(不会刷新),如下图:

其实在我的另一篇博文《一文入门Qt Quick》中也有对这一块主题的说明,不妨去看看吧!


标签:engine,include,C++,调用,QML,QDateTime,currentDateTime
From: https://www.cnblogs.com/englyf/p/16842927.html

相关文章

  • C++11绑定器bind及function机制
    前言之前在学muduo网络库时,看到陈硕以基于对象编程的方式,大量使用boost库中的bind和function机制,如今,这些概念都已引入至C++11,包含在头文件<functional>中。本篇文章主要......
  • C++求高精度pi(2)高斯-勒让德算法
    C++分析参考目前求π的算法中哪种收敛最快?-知乎(zhihu.com)中@byoshovel答主的回答,有这些比较容易想到的方法对于我们的任务来说,拉马努金公式和加强鬼畜公式和BBP......
  • 《Effective C++:改善程序与设计的55个具体做法》阅读笔记 5——实现
    条款26:尽可能延后变量定义式的出现时间尽可能延后变量定义式的出现时间,因为有些变量定义了,可能未被使用,如“异常抛出,导致很多代码没有运行,这就有可能导致定义的变量未......
  • 函数的常见样式/声明(C++/C)
      ============1.无参无返:  2.有参无返:  3.无参有返:  4.有参有返:  _____________________________________________________________________......
  • C++中的explicit
    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的;而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造......
  • C++内存管理
    文章目录自学网站写在前面C/C++内存分布C语言内存管理C++内存管理操作内置类型操作自定义类型operatornew&operatordeletenew&delete实现原理内置类型自定义类型定位n......
  • C++——智能指针unique_ptr
    独占指针:unique_ptrunique_ptr在任何给定的时刻,只能有一个指针管理内存当指针超出作用域时,内存将自动释放该类型指针不可Copy,只可以Move运行结果没有运行delete......
  • C++ DoubleLinkedList
    C++DoubleLinkedListForthisassignment,createaclassthatrepresentsadoublelinkedlist(forwardandbackwardnavigation),calledDoubleLinkedList,ofin......
  • C++——智能指针概述
    C++指针分类原始指针(rawpointer)智能指针:智能指针是原始指针的封装,其优点是会自动分配内存,不用担心潜在的内存泄露并不是所有的指针都可以封装成智能指针,很多时候......
  • 【C++】右值引用
    来源于:https://zhuanlan.zhihu.com/p/3359943701.什么是右值引用左值可以取地址、位于等号左边。右值没法取地址、位于等号右边。有地址的变量就是左值,没有地址的字面......