01 背景
【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件;WordBN基于VS2019、Qt6.5开发,使用Qt Quick(QML)开发语言。
本课程将以【WordBN字远笔记】的界面为实战基础,详细介绍如何基于Qt/QML开发语言,从零开始开发一套真正的程序,包括国际化、版本发布、安装包制作等项目实战技巧。
本课程重点不是教你如何开发一个笔记软件,而是教你如何利用Qt/QML+C++开发一个完整的程序,整套课程规划有40+章节,敬请关注!
本章内容《#06 学习QML、C++混合编程方式:QML调用C++接口;获取屏幕尺寸》
02 课程目标
- 新建C++类,添加函数实现获取当前屏幕宽度和高度。
- 把C++类注册QML上。
- 在QML界面YApplicationWindow调用C++函数,实现界面初始显示宽度和高度。
03 知识点
- 注册给QML使用的C++类必须继承于QObject,并在其中使用Q_OBJECT宏。
- QINVOKABLE宏:QINVOKABLE用来修饰一个C++成员函数,使该成员函数暴露给QML。
04 新建常用套件C++类:YUtils
- YUtils类设计:用于实现一些常用功能;如获取屏幕尺寸,文件读写等
- 新建C++类YUtils:
- Q_INVOKABLE用于修饰函数,让C++类函数支持QML调用;YUtils.h 头文件代码如下:
#ifndef YUTILS_H
#define YUTILS_H
#include <QObject>
// 常用方法套件类
class YUtils : public QObject
{
Q_OBJECT
public:
explicit YUtils(QObject *parent = nullptr);
// 获取屏幕宽度函数
Q_INVOKABLE static int getScreenWidth();
// 获取屏幕高度函数
Q_INVOKABLE static int getScreenHeight();
signals:
};
#endif // YUTILS_H
- 获取屏幕宽度和高度函数核心代码:
#include <QGuiApplication>
#include <QScreen>
int YUtils::getScreenWidth()
{
QScreen *screen = QGuiApplication::primaryScreen();
QRect rect = screen->geometry();
int width = rect.width();
return width;
}
int YUtils::getScreenHeight()
{
QScreen *screen = QGuiApplication::primaryScreen();
QRect rect = screen->geometry();
int height = rect.height();
return height;
}
05 将C++类YUtils注册到QML上下文
- 修改 main() 函数注册C++类到QML上下文,核心例子代码如下:
#include "YUtils.h"
YUtils utils;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("utils", &utils);
06 YApplicationWindow.qml调用C++函数
- YApplicationWindow.qml 调用 YUtils 函数,实现主界面默认宽度高度功能,代码如下:
import QtQuick
import QtQuick.Controls
ApplicationWindow {
visible: true
width: utils.getScreenWidth() - 20
height: utils.getScreenHeight() - 80
title: qsTr("WordBN")
menuBar: YMenuBar {
}
}
07 课后练习
- 新增多语言切换C++类YLanguage,实现切换语言功能并注册到QML。
- 结合前一课内容,实现点击菜单切换中文和英文,并保存当前语言到ini配置文件,每次程序重启能自动读取到当前语言并自动切换。
- 使用QSetting类保存和读取ini配置文件。
-End-
#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。
本人小杨哥:
超20年C++开发经验,独立软件开发;著名开源产品高并发C++应用服务器MYCP作者;开源企业即时通讯软件Entboost首席架构师;开发有WordBN字远笔记等共享软件产品。招C++/Qt开发学员,欢迎关注咨询~~