Qt 6之四:基础概念讲解
Qt是一种跨平台的C++应用程序开发框架,它提供了一套丰富的工具和库,可以帮助开发者快速构建跨平台的应用程序,用于开发图形用户界面(GUI)和非GUI应用程序。
Qt 6之一:简介、安装与简单使用 https://blog.csdn.net/cnds123/article/details/130730203
Qt 6之二:项目的结构、资源文件的使用https://blog.csdn.net/cnds123/article/details/130741807
Qt 6之三: 项目的发布 https://blog.csdn.net/cnds123/article/details/130827966
Qt Creator是一个跨平台的集成开发环境(IDE),主要用于Qt应用程序开发。
Qt Creator 的构建系统(Build system )概述
Qt Creator支持多种构建系统(Build system),每种构建系统都有其特点和用法。以下是构建系统的概述:
QMake
QMake是Qt的传统构建系统,它使用简单的.pro(项目)和.pri(包含)文件来定义项目的构建过程。
特点:
- 紧密集成于Qt。
- 简单易学,适合小到中等规模的项目。
- 自动生成Makefile,跨平台支持良好。
用法:
- 创建.pro文件,定义项目中的文件、库依赖和其他构建参数。
- 在Qt Creator中打开.pro文件,IDE将自动处理构建配置。
- 使用Qt Creator的构建、运行和调试功能来开发应用程序。
一个简单的 .pro 文件可能如下所示:
SOURCES += main.cpp MyWidget.cpp
HEADERS += MyWidget.h
QT += widgets
在 Qt Creator 中,打开 .pro 文件会自动识别为一个 QMake 项目。你可以在项目设置中修改构建目录、编译器选项等。需要注意的是新版本Qt Creator如 10.0.1 版本不再在新建项目时提供 QMake 选项。
CMake
CMake是一个开源的跨平台构建系统,它使用CMakeLists.txt文件来定义构建过程。
特点:
- 支持复杂的项目结构和大型项目。
- 强大的模块和脚本支持。
- 跨平台生成原生构建文件,如Makefile、Ninja、Visual Studio项目等。
用法:
- 创建CMakeLists.txt文件,使用CMake命令来定义项目构建规则。
- 在Qt Creator中打开项目,指定CMake为构建系统。
- 使用Qt Creator的构建、运行和调试功能来开发应用程序。
一个简单的 CMakeLists.txt 文件可能如下所示:
cmake_minimum_required(VERSION 3.5)
project(MyApp VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(MyApp main.cpp)
在 Qt Creator 中,打开 CMakeLists.txt 文件会自动识别为一个 CMake 项目。你可以在项目设置中修改构建目录、CMake 生成器等
Qbs
QbsQbs(Qt Build System)是一个新的构建工具,由Qt开发,用于替代QMake。
特点:
- 基于规则的配置,更现代和灵活。
- 跨平台,支持并行构建和增量构建。
- 集成了Qt模块和其他工具链。
用法:
- 创建.qbs文件,定义项目构建逻辑和依赖关系。
- 在Qt Creator中选择Qbs作为构建系统。
- 配置构建设置,并使用Qt Creator的功能进行开发。
一个简单的 .qbs 文件可能如下所示:
Project {
name: "MyApp"
files: "main.cpp"
Depends { name: "cpp" }
}
在 Qt Creator 中,打开 .qbs 文件会自动识别为一个 Qbs 项目。你可以在项目设置中修改构建目录、编译器选项等。
对于Qt Creator支持的构建系统,Qt Creator会自动生成相应的构建配置文件,如.pro文件(qmake)、CMakeLists.txt文件(CMake)等。你可以直接在Qt Creator中编辑这些文件,或者使用外部编辑器进行修改。在大多数情况下,这些文件在项目的初次创建时会被自动生成,且在大部分时间里,你可能不需要手动修改这些文件。这是因为Qt Creator提供了一种图形化的方式来管理这些设置,比如通过项目属性页面来添加或删除源文件和库,设置编译器标志等。这些更改会自动反映在构建配置文件中。注意,在对构建配置文件进行更改后,应该测试构建过程,确保一切按预期工作。
Qt 创建 C++ GUI 应用程序方法概述
在 Qt 中,创建 C++ GUI 应用程序主要有两种方法:
1、使用Qt工具
☆若使用Qt Widgets,您可以使用Qt Creator中的设计师(Designer)来可视化设计和排列控件,然后使用C++代码编写逻辑。
☆若使用Qt Quick,您可以使用Qt Creator中的Qt Quick Designer来可视化设计和布局QML界面,然后使用C++代码编写逻辑。
☆若使用Qt Quick Controls 2,您可以使用Qt Creator中的Qt Quick Designer和Qt Quick Controls Gallery来可视化设计和排列控件,然后使用C++代码编写逻辑。
Qt Widgets、Qt Quick和Qt Quick Controls 2是Qt框架中不同的UI模块(组件集合),用于创建不同类型的用户界面。
Qt Widgets是Qt框架中的一组类集合,它们代表了各种GUI元素,如按钮、滑块、文本框等,适用于创建传统的桌面应用程序。
Qt Quick是基于QML的一种现代的、动态的用户界面技术。它提供了一种描述性的语言和一套UI组件,可以创建富有动感的、流畅的用户界面。并且,Qt Quick Controls 2是Qt Quick的一部分,提供了一套现代化的、风格一致的UI控件,如按钮、滑块、对话框等。
Qt Designer、Qt Quick Designer和Qt Quick Controls Gallery是Qt Creator内置的工具。
Qt Designer:它是用于创建和编辑基于Qt Widgets的用户界面的可视化工具。您可以直观地在设计界面上拖放和排列控件,设置控件的属性,以及编辑控件的信号和槽等事件响应函数。此工具非常适合开发传统的、基于窗口的桌面应用程序。
Qt Quick Designer:这是一个用于创建和编辑基于Qt Quick的用户界面的可视化工具。与Qt Designer类似,您可以在设计界面上拖放和排列控件,设置控件的属性,以及编辑控件的事件响应函数。此工具非常适合开发动态的、响应式的、基于QML的应用程序。
Qt Quick Controls Gallery:这是一个展示Qt Quick Controls 2中所有控件和样式的应用程序。您可以运行它来查看和测试各种控件和样式,以选择最适合您的应用程序的控件和样式。此工具可以帮助您更好地了解和使用Qt Quick Controls 2。
另外,Qt Design Studio是一个独立的、强大的UI设计和开发工具,它可以创建基于Qt Quick和Qt Quick Controls 2的用户界面。Qt Design Studio也支持导入Photoshop和Sketch等设计工具的原型,使得设计师和开发者可以更好地协作。
2、手动编写代码:通过完全手工编程方式创建 GUI 应用程序,您可以使用 Qt框架中 的 QWidgets 、Qt Quick和Qt Quick Controls 2 Qt模块,直接在 C++ 代码中创建和操作 GUI 组件。这种方法需要您熟悉 Qt 的类和 API,并逐个编写 GUI 组件的代码。虽然这种方法可以提供更灵活的控制和更高的定制化程度,但它需要更多的时间和精力来编写和维护代码。
不同的构建系统对资源文件(如图片、音乐)的处理方式概述
不同的构建系统(qmake、CMake或Qbs),对资源文件(如图片、音乐)的处理方式会有所不同。在某些情况下,你需要手动修改配置文件以确保这些资源被正确地包含在项目中。在Qt Creator中,使用qmake时,你可以通过图形界面来编辑.qrt文件------资源通常通过Qt资源系统(QRC)来管理,而不需要手动处理文件路径和加载资源的细节,这样可以简化资源文件的管理。对于CMake和Qbs,你可能需要手动编辑文本文件来管理资源。
以下是每个构建系统处理资源文件的基本方法:
qmake
在使用qmake时,资源通常通过Qt资源系统(QRC)来管理。你需要创建一个资源文件(通常以.qrc为扩展名),并在其中列出项目中使用的资源。然后,在.pro文件中添加对这个资源文件的引用。
例如,你的.qrc文件可能看起来像这样:
<RCC>
<qresource prefix="/images">
<file>logo.png</file>
<file>background.jpg</file>
</qresource>
<qresource prefix="/sounds">
<file>click.wav</file>
</qresource>
</RCC>
CMake
对于使用CMake的项目,资源可以通过在CMakeLists.txt文件中设置相应的命令来包含。CMake不像qmake那样有一个内置的资源系统,但你可以通过将资源文件复制到构建目录或指定的输出目录来管理资源。
例如,你可以使用configure_file或file(COPY ...)命令来复制资源:
configure_file(path/to/logo.png path/to/build/directory/logo.png COPYONLY)
或者
file(COPY ${CMAKE_SOURCE_DIR}/images/logo.png DESTINATION ${CMAKE_BINARY_DIR}/images)
Qbs
Qbs是一个新的构建工具,它也有自己的方法来处理资源。在.qbs文件,你可以使用Group项来指定资源文件,并将它们包含在项目中。
例如:
Group {
name: "Images"
files: ["images/logo.png", "images/background.jpg"]
fileTags: ["image"]
}
Group {
name: "Sounds"
files: ["sounds/click.wav"]
fileTags: ["sound"]
}
这里有一点需要澄清的是,一旦您创建了配置文件(.qrc、CMakeLists.txt或.qbs文件)并设置了包含资源的规则,当您添加新的资源文件到已经指定的目录或者模式下时,您可能不需要每次都手动更新配置文件。例如:
- 在qmake中,如果您在.qrc文件中指定了一个目录,那么该目录下的所有资源文件都将包含在内,无需每次添加新文件时都修改.qrc文件。
- 在CMake中,您可以编写脚本来自动将某个目录下的所有文件作为资源,或者使用通配符来指定资源文件,这样在添加新文件时就不需要修改CMakeLists.txt。
- 在Qbs中,同样,您可以指定一个目录,使得该目录下的所有文件都被视为资源。
但是,如果您更改了资源文件的结构,如添加新的目录或改变文件的组织方式,您仍然需要更新这些配置文件以反映这些变化。此外,如果您希望资源在构建系统中有特殊的处理,如指定不同的资源前缀或者为不同的构建目标包含不同的资源集,您也需要手动编辑这些配置文件。
Qt 交互和通信方式概述
Qt框架提供了多种方式来实现对象之间的交互和通信。以下是一些主要的机制:
- 信号和槽(Signals and Slots ) :
- 这是Qt中最强大的通信机制,也是Qt对象之间交互的核心。
- 信号是由对象发出的消息,表明发生了某个事件或者状态的改变。
- 槽是可以响应信号的函数,可以是普通的成员函数、静态函数或lambda表达式。
- 当一个信号被发射时,连接到这个信号的所有槽都会被调用。
- 使用QObject::connect()函数来建立信号和槽之间的连接。
- 事件处理(Event Handling ) :
- Qt中几乎所有的用户界面事件,如鼠标点击、按键按下等,都是通过事件系统来处理的。
- 事件是QEvent类的实例,它包含了事件的所有相关信息。
- 事件通过事件循环分发给相应的对象,并由对象的event()函数处理。
- 你可以通过重写event()函数或更具体的事件处理函数(如mousePressEvent()、keyPressEvent()等)来自定义事件的处理。
- 远程对象通信(Inter-Process Communication, IPC ) :
- Qt提供了多种IPC机制,包括但不限于:
- DBus: 适用于Unix-like系统的IPC机制。
- TCP/UDP Sockets: 网络通信的基础,Qt通过QTcpSocket、QUdpSocket等类提供了对套接字编程的支持。
- Shared Memory: 允许不同进程访问同一块内存区域。
- Pipes: 传统的IPC机制,Qt通过QProcess类支持管道通信。
- 多线程(Threading ) :
- Qt支持多线程编程,可以通过继承QThread类或使用QtConcurrent模块来实现。
- 通过线程,你可以执行长时间运行的任务而不阻塞主线程,保持用户界面的响应性。
- Qt提供了线程安全的信号和槽连接,可以安全地在不同线程之间发送信号。
- 定时器(Timers ) :
- 定时器可以在特定的时间间隔后发出信号,这可以用来触发周期性的事件,如定时更新UI或者检查某个条件是否满足。Qt提供了多种定时器工具,如QTimer、QElapsedTimer等,允许开发者定时执行特定任务,如更新界面、处理数据等。定时器可以用于实现动画效果、任务调度等功能。
以上是Qt中常用的交互和通信方式的概述。根据应用程序的需求和场景,你可以选择适合的方式来实现组件之间的交互和数据传输。
下一讲,将介绍GUI 应用程序示例。