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 的相关文章

  • QML:即使拖动属性处于活动状态,也不会调用 onDragStarted / finish

    在下面的例子中我希望onDragStarted onDragFinished当拖动一个矩形时调用 然而仅drag onActiveChanged 鼠标区域 和Drag onActiveChanged 矩形的被称为 设置时我得到了预期的输出D
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • Qt:将数字转换为 QString、QVariant 或 QString::number 哪个更好

    我只是好奇 比方说 我需要在控制台中输出一个数字 代码是 include
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • 使用 QWT 构建时出错

    我收到一个错误 undefined reference to QwtPlot QwtPlot QWidget 当我尝试构建我的项目时 即使设置中一切看起来都很好 在我的 CmakeLists txt 中我有 include director
  • PyQt5 使动态小部件可点击并将参数传递给另一个函数

    我正在尝试制作动态小部件并使它们可点击 通过单击一个小部件 它应该将动态值传递给其他小部件 我尝试过 sender 和其他访问小部件的选项 但没有任何效果 所有小部件都从最后一个小部件发送信息 下面是代码 import sys from P
  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做
  • 当选项卡到另一个组件位置时,QML 中相应的滚动

    我想做的是 如果我从TextField到另一个组件 aComboBoxwtv 我希望滚动能够适应这一点 当我认为这非常重要时 当我执行连续选项卡时 我会转到滚动视图显示的内容下方的控件 一个例子是 假设我在这里 now i do 2 tab
  • 日历小部件的特定单元格如何着色?

    日历小部件的特定单元格如何着色 我认为你应该扩展 QCalendar 类并添加一些行为 我在这里找到了一些东西 http www qtforum org article 21614 paintcell and qcalendarwidget
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel

随机推荐

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

    教程 目录 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