Quick - Hello World

1 篇文章 0 订阅

背景

Qt4自2005年发布已为成千上万的应用程序甚至桌面操作系统、移动操作系统提供了稳定、可靠的开发框架。

计算机用户的使用模式近年发生了变化,用户正在从传统PC转向笔记本电脑或智能手机。传统PC被越来越多的触摸屏设备取代,计算机的用户体验模型也在跟随改变。在这之前Windows UI占据了我们的世界,但现在我们会花更多的时间使用其它的UI语言开发便携式设备用户界面。

Qt4的设计用于满足开发者在主流桌面操作系统上有一套表现一致的窗口组件可以使用。如今Qt的使用者面临了新的问题,他们需要提供可触碰交互的用户界面以满足软件界面需求,并在主流桌面操作系统和移动操作系统上实现这些界面。

Qt4.7 版本开始引进了 Qt Quick,它让Qt的使用者可以用简单的元素对象创建一套界面组件,并通过组合界面组件的方式来完成软件界面需求。

QML 作为一种灵活高效的界面开发语言已经越来越得到业界的认可。使用 QMLJavaScript 创建用户界面,后端使用 C++ 处理数据。前后端的分离让前端开发人员可以快速迭代并专注于用户界面开发,后端的 C++ 开发人员则专注于软件的稳定性、高性能和扩展能力。

谈一谈为我什么学QtQuick

  • 桌面应用式微,移动端、嵌入式端崛起,且传统桌面开发正在被 Chromium V8 + 大前端 的模式所侵占。

    这方面最最具代表性的应数 VSCode。不信自己检查一下自己电脑上还是多少软件是采用 .Net原生开发、还有多少应用是采用 Qt 这类的跨平台框架、还有多少应用是采用 Chromium V8 + 大前端

  • 这是一个看脸的时代:传统Qt没有好看的 开源ui库,而默认样式风格较为远古,调qss 也并不是一件然人愉快的事情!

    QtQuick 所用 qml 可以视为是 JavaScript 的超集,存在享受前端喷井式爆发红利的可能性。

    之所以这样说是因为我发现了一个VOFA+ 的项目,它采用 QtQuick 开发,颠覆了我对Qt应用的认知。(原谅我见得少)

    在这里插入图片描述

  • 在现代的软件开发中有一个内在的冲突,用户界面的改变速度远远高于我们的后端服务。在传统的技术中我们开发的前端需要与后端保持相同的步调。当一个项目在开发时用户想要改变用户界面,或者在一个项目中开发一个用户界面的想法就会引发这个冲突。

    很不幸,由于前期需求不明确,我目前所作的项目正在饱受该问题的困扰。

    Qt Quick 提供了一个类似 HTML 声明语言的环境应用程序作为你的用户界面前端(the front-end),在你的后端使用本地的 c++ 代码。能较好的解决这个给问题。

  • 一点小算盘:在 Qt - UI数据双向绑定简易实现 中使用的数据UI双向绑定实现得过于粗暴,且绑定得数据类型必须是是 Hint ,基本没有实际可用意义。qml 有属性绑定,或许我可以参考点什么。

  • 必须对新事物保持敏感度。

环境搭建

Qt 安装

Qt5.15(最新LTS) 开始,对于开源版本已经不提供已经制作好的离线exe安装包,我们只能选择:

  • 自行编译安装

  • 在线联网安装

安装包下载地址:

Qt联网在线联网安装包下载-清华镜像(戳)

安装过程略,可参考:

Qt6 在线安装图文步骤

VS2019 安装

这里我选择的是 VS2019 Professional版(听说它比较小)

安装完成后我们还需要补充工作负载:

在这里插入图片描述

Qt Visual Studio Tools

若想在VS中导入Qt工程,需要安装 Qt Visual Studio Tools

可至 扩展->管理扩展 中添加:

在这里插入图片描述
安装完成后还需要进行配置:

在这里插入图片描述
在这里插入图片描述
导入工程后出现以下警告直接忽略即可,我们需要手动打开工程文件:

在这里插入图片描述

Hello World

安装完成后,老规矩,我们从 Hello World 开始。

新建空白工程:

在这里插入图片描述

.pro

QT += quick

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

RESOURCES += qml.qrc

TRANSLATIONS += \
    empty_zh_CN.ts

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

与我们以往的 Project 不同的是:

  • QT += quick

  • RESOURCES += qml.qrc

  • QML_IMPORT_PATH =

  • QML_DESIGNER_IMPORT_PATH =

  • Default rules for deployment

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>                                                // include a QML engine

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);                // High DPI Displays(added in Qt 5.6)
#endif
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));                            // loading QML file
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

注意:这里使用了之前没见过的类,QQmlApplicationEngineengine 加载 main.qml ,如果加载失败那么程序退出,然后开启了事件循环,仅此而已。

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Text {
        text: "<b>Hello</b> <i>World!</i>"
    }
}

看着就知道什么意思了…

我随手加了个 Text 以显示 “Hello World!”

运行效果

在这里插入图片描述

参考鸣谢

QmlBook-In-Chinese

Qt Quick简明教程

QuickEncrypt,数据安全小工具,采用托盘图标、悬浮窗、鼠标拖拽、右键菜单的简单操作模式,提供文件、文本的加解密(RC4+AES)、Hash(MD5+SHA1)、安全擦除等功能。独有的“智能压缩”加密模式。 1.功能介绍 对鼠标拖入的文本进行加解密 对剪贴板中的文本进行加解密 对鼠标拖入的文件进行加解密 对鼠标拖入的文件进行擦除 对鼠标拖入的文本进行Hash计算 对剪贴板中的文本进行Hash计算 对鼠标拖入的文件进行Hash计算 针对文本和文件加解密的智能数据压缩技术 支持超过4GB的大文件 2.安全机制 2.1 文件擦除策略 a.修改文件名为随机串; b.以32字节的块向文件写入全0; c.刷新数据,关闭文件; d.修改文件名为随机串; e.以32字节的块向文件写入全1; f.刷新数据,关闭文件; g.截断文件大小为0; h.删除文件。 经测试常用数据恢复软件无法成功恢复原有数据。 2.2 Hash算法 使用OpenSSL 0.98提供的MD5(128位)和SHA1(160位)算法。 2.3 加解密密钥生成 将用户输入的密码明文转换成utf-8字节数组(不包含0结束符),计算MD5和SHA1,将MD5结果用作AES 128位密钥,将SHA1结果用作RC4密钥。 2.4 文本加密策略 a.将明文数据转换成utf-8字节数组(包含0结束符); b.对明文字节数组计算CRC32校验码,用于解密时校验,并将CRC32值放在明文首字节之前; c.尝试压缩步骤b的结果(zlib level9),若获得较小的压缩结果则输出压缩后的编码数组,否则放弃压缩,直接输出步骤b的结果; d.对步骤c的结果进行RC4流加密(OpenSSL 0.98); e.对步骤d的结果进行AES_CFB_128分组加密(OpenSSL 0.98); f.对步骤e的结果进行Base64编码(OpenSSL 0.98); g.将标记"QE:|"附加在步骤f的结果之前,输出结果。 2.5 文件加密策略 a.判断输入文件的扩展名是否是压缩格式,对常见压缩格式和流媒体编码文件不启用数据压缩功能; b.以1MB大小分块,读入明文文件数据; c.对分块的明文数据计算MD5,附加在待加密数据之前,用于解密时校验; d.尝试压缩1MB大小的分块,若获得较小的压缩结果则输出压缩后的编码数据,否则直接输出原文; e.对步骤d的结果进行RC4流加密(OpenSSL 0.98); f.对步骤e的结果进行AES_CFB_128分组加密(OpenSSL 0.98); g.将分块数据依次写入输出文件,输出文件的文件名是在原文件名后加".enc"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值