網站首頁 編程語言 正文
先說明一下測試環境
編譯器: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。
顯示的效果是動態刷新時間日期數據的,這和在上下文中設置類型數據不同(不會刷新),如下圖:
原文鏈接:https://www.cnblogs.com/englyf/p/16842927.html
相關推薦
- 2022-07-30 SpringBoot的數據校驗(@Validated注解)、關于validation無法導入的問題解
- 2022-04-16 pytorch?collate_fn的基礎與應用教程_python
- 2022-04-28 WPF路由事件中的三種策略介紹_實用技巧
- 2022-07-13 Dos攻擊Tomcat導致coredump問題分析
- 2022-08-23 React?中的列表渲染要加?key的原因分析_React
- 2022-06-28 深入解析docker文件分層原理_docker
- 2022-08-12 k8s?series初級calico使用介紹_云其它
- 2022-10-29 MultipartFile工具類的簡單介紹
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支