Quick - Hello World

2023-10-26

背景

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简明教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quick - Hello World 的相关文章

  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本

    几天来我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本 我就是不明白我做错了什么 System Windows 7 64 位 Visual Studio 2013 仍安装 Visual Studio 2012
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub

随机推荐

  • 两台电脑直接使用一根网线传输文件

    教程 目录 https blog csdn net dkbnull article details 87933584 有时候我们需要在两台电脑之间传输几十G的大文件 或者置换新电脑时复制文件到新电脑 而我们身边又没有移动硬盘 就可以考虑使用
  • 页面中引入高德地图

    一 打开高德开放平台网站https lbs amap com 点击右上角注册 如下图所示 二 按要求填写注册信息 三 注册完成之后 进入控制台 点击右上角 创建新应用 名称随便写 如下图所示 四 在应用右上角点击 添加 新增key 五 将新
  • ES6知识点总结三:数组的扩展(扩展运算符···、Array.from()、Array.of()...)

    4 数组扩展之扩展运算符 扩展运算符 spread 是三个点 它好比 rest 参数的逆运算 将一个数组转为用逗号分隔的参数序列 var arr 1 2 3 9 8 arr 9 8 1 2 3 a 1 2 3 a 1 2 空数组不会有有变化
  • 赞!一篇博客讲解清楚 Python queue模块,作为Python爬虫预备知识,用它解决采集队列问题

    Queue 模块 只要涉及到多线程爬虫 就会涉及到数据采集队列的优先级问题 在 Python 中 Queue 模块提供了一个同步的 线程安全的队列类 它包括常见的 FIFO 先入先出 LIFO 后入先出 PriorityQueue 按优先级
  • 【JAVA】代码规范

    一 命名规约 1 强制 所有编程相关命名均不能以下划线或美元符号开始 也不能以下划线或美元符号结束 反例 name name Object name name Object 2 强制 类名使用UpperCamelCase风格 必须遵从驼峰形
  • 计算机传输速率127,计算机基础知识2

    3 提高可靠性 计算机网络中的各台计算机可以通过网络互相设置为后备机 一旦某台计算机出现故障时 网络中的后备机即可代替继续执行 保证任务正常完成 避免系统瘫痪 从而提高了计算机的可靠性 4 分担负荷 当网上某台计算机的任务过重时 可将部分任
  • visjs 数据的增删改筛选(DataSet & DataView)

    visjs中的 DatatSet 用于数据的保存 可操作非结构化数据 并可监听数据的变化 DataSet构造 var data new vis DataSet data options 构造后 可通过 add updateOnly upda
  • Pandas知识点-DataFrame数据结构介绍

    Pandas知识点 DataFrame数据结构介绍 一 Pandas简介和安装 Pandas是Python中用于数据处理和数据分析的开源库 2008年由金融数据分析师Wes McKinney开发 开发Pandas的初衷是为了方便进行金融数据
  • 如何在pycharm中使用git

    一 环境配置 1 下载安装git 安装成功后 打开git bash here输入以下命令配置基础信息 git config global user name 用户名 git config global user name 邮箱地址 输入命令
  • 关于配置Golang语言环境中的一些问题以及配置yum源的方法

    关于配置Go语言环境中的一些问题 坚持不做无用的 重复的 混字数的博客 所以主要谈及安装使用过程中遇到的问题 具体安装参考博客 https pmlpml github io ServiceComputingOnCloud ex instal
  • SpringBoot中注入RedisTemplate报空指针

    现象 RedisTemplate不能作为静态变量注入 否则报空指针 错误做法 private static RedisTemplate
  • Pandas 中 SettingwithCopyWarning 的原理和解决方案

    Pandas 中 SettingwithCopyWarning 的原理和解决方案 原文链接 https www dataquest io blog settingwithcopywarning 原文标题 Understanding Sett
  • 防御第二天-防火墙演示实验

    1 上课思维导图 2 防火墙演示实验 防火墙FW1 原用户名 admin 原密码 Admin 123 配地址
  • 狂神docker学习笔记

    文章目录 前言 Docker 概述 1 Docker 为什么会出现 2 Docker 历史 3 Docker 能干嘛 Docker 安装 1 Docker的基本组成 2 安装Docker 3 阿里云镜像加速 4 回顾HelloWorld流程
  • Application is running inside IIS process but is not configured to use IIS server

    删除Program webBuilder UseKestrel
  • JSON字符串转换成List对象集合

    简单说下 有一个json字符串 我想通过jackson把json字符串转换成list对象集合 网上找了很多 但都不尽人意 后来还是看jackson文档 才知道怎么做 需要的包
  • ubuntu20.04配置安装frp内网穿透

    1 frp所在的github地址 https github com fatedier frp 2 下载 wget https github com fatedier frp releases download v0 38 0 frp 0 3
  • from keras.engine.topology import Layer 无此模块问题

    这可以说是深度学习必踩坑 就是版本问题 复现别人得代码时出现得问题 一开始没发现这篇博文 在GitHub上找了一圈都没找到这个引入 还走了弯路 以为是新版本包不一样了 修改也不可行 还是见识少了 这篇博客没营养 只作踩坑记录 参考博客 Ke
  • 什么是测试开发工程师(SET)?

    经常有人问到 什么是 软件测试开发工程师 Software Engineers in Test 缩写为SET 借用Google的规范来说其实就是 在测试中的软件工程师 其工作性质上首先是测试 然后才是开发 那么这里会让大家产生一个矛盾的感觉
  • Quick - Hello World

    文章目录 背景 谈一谈为我什么学QtQuick 环境搭建 Qt 安装 VS2019 安装 Qt Visual Studio Tools Hello World pro main cpp main qml 运行效果 参考鸣谢 背景 Qt4自2