安装和第一个helloworld实例什么的的就不讲了,网上很多例子。我们直接就从界面开始将吧,因为也是自己摸索,有错误麻烦指正。
一、创建一个APP
1、build system
在 Qt Creator 中创建项目时,Build system 的选择通常由你使用的项目类型决定。Qt Creator 默认提供了几种构建系统选项,选择哪种构建系统取决于你的项目规模和复杂性。
主要构建系统选项:
qmake: Qt 自带的构建系统。它通过 .pro 文件来描述项目,使用 qmake 命令生成可用于不同构建工具(如 Make,Ninja)的构建文件。 通常是 Qt C++ 项目的默认构建系统,对于小型到中型项目来说是不错的选择。 qmake 具有跨平台支持,能处理相对简单的依赖关系。
CMake: 一个流行且强大的跨平台构建系统生成器。它允许使用声明式方法来描述构建过程,生成各种构建工具(如 Make、Ninja、Visual Studio)的构建文件。 CMake 非常适合大型项目,因为它可以处理复杂的依赖关系、多平台支持、以及不同编译器选项。 对于需要在不同平台上构建、或有大量依赖项的项目,CMake 是一个很好的选择。
如何选择:
小型或中等规模的 Qt 项目: 通常情况下,qmake 就足够了。它易于上手,并且对于大多数简单项目来说性能良好。
大型项目,跨平台支持,或复杂的依赖关系: 选择 CMake。CMake 可以更好地管理大型项目中的复杂依赖关系,并且提供了强大的跨平台支持。
Qt Creator 中的构建系统选择:
当你在 Qt Creator 中创建新的 Qt 项目时,通常会自动选择合适的构建系统。 如果你想更改默认构建系统,你可以在 .pro 文件中进行配置,或者在项目设置中选择相应的构建系统。
2 Kit Selection
Qt C++ 创建项目时,Kit Selection (工具链选择) 是一个非常重要的步骤,它决定了你的项目将会使用哪个编译器、哪个 Qt 版本以及其他编译选项。 正确选择 Kit 对于项目的构建和运行至关重要。
Kit Selection 的作用:
1、指定编译器: 选择 Kit 时,你需要选择一个编译器 (例如,MinGW、MSVC、clang)。不同的编译器有不同的特性和支持的标准,选择不当可能会导致编译错误。
2、指定 Qt 版本: Kit 会关联一个特定的 Qt 版本。 这意味着你的项目将使用该 Qt 版本提供的库和类。 选择错误的 Qt 版本可能会导致你的代码无法运行。
3、指定编译选项: Kit 还会包含一些编译选项,例如优化级别、调试信息等。
4、确保跨平台兼容性: 一个好的 Kit 应该能够在目标平台上正确配置编译器和库,从而确保你的项目在不同的平台上能正确编译和运行。
如何选择合适的 Kit:
考虑你的目标平台: 如果你想在 Windows 上构建,则需要选择包含 Windows 编译器的 Kit;macOS 需要选择包含 Xcode 的 Kit;Linux 需要选择包含 GCC 或其他编译器的 Kit。
1、考虑你的 Qt 版本: 确保选择的 Kit 中的 Qt 版本与你的项目兼容。
2、考虑编译器选项: 如果需要特定编译器选项(例如,优化级别),请选择包含这些选项的 Kit。
3、检查 Kit 的兼容性: 在选择 Kit 之前,最好检查该 Kit 是否与你的项目代码中的库、类和其他依赖关系兼容。
4、考虑调试工具: 有些 Kit 会包含调试器,这有助于你调试你的项目。
5、实际运行测试: 选择 Kit 后,最好进行简单的测试构建和运行,以确保一切正常。
这俩个都可以单独拉出来细细讲一讲,这里大致了解下。
如果没有选择Kit ,这时候Qt Creator 界面如下
点击扳手选择对应的Kit,然后点击Configure Project开始我们的界面编辑之旅。
这里,我们创建了一个interFace项目,Qt Creator 自动帮我们生成了一个interFace.pro文件,一个main.cpp,一个mainwindow类以及一个mainwindow.ui文件
Qt C++ 的 .pro 文件是项目的构建描述文件,Qt Creator 使用它来编译你的项目。
interFace.pro
bash
# 指定项目需要使用的 Qt 模块。 core 是 Qt 的核心模块,gui 是图形用户界面模块。 你需要根据项目
# 实际需求添加其他模块。
QT += core gui
# greaterThan(QT_MAJOR_VERSION, 4): 这是一个条件表达式,检查当前 Qt 版本的主版本号是否大于 4。
# QT_MAJOR_VERSION 是一个预定义变量,保存了 Qt 安装的主版本号。
# QT += widgets: 这是在条件为真(即 Qt 版本主版本号大于 4)时执行的操作,它将 widgets
# 模块添加到项目需要的 Qt 模块列表中。 widgets 模块包含与图形用户界面相关的类和函数。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 指定了c++的版本
# Qt 中有很多 CONFIG 选项。 例如 debug, release, warn_on, warn_all, release, profile. 了解这些选项会帮助你更好地控制编译过程。
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
# 定义预处理器宏 QT_DEPRECATED_WARNINGS,它会过滤并警告你代码中使用到的过时 Qt 函数或类。
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# 列出源文件(.cpp)
SOURCES += \
main.cpp \
mainwindow.cpp
# 列出头文件(.h)。
HEADERS += \
mainwindow.h
# 将 mainwindow.ui 这个 Qt Designer 设计的 UI 文件添加到项目中。
FORMS += \
mainwindow.ui
# Default rules for deployment.
# 如果目标是在 QNX 操作系统上构建的,则将目标的安装路径设置为 /tmp/$${TARGET}/bin。
# $${TARGET} 是一个变量,包含你的目标名称。 例如,如果你的目标是 myApp,路径将是 /tmp/myApp/bin
# 如果前面的条件 (qnx) 为假(意味着它不是 QNX 系统),并且 它是一个类 Unix 系统
#(不是 Android),则安装路径设置为 /opt/$${TARGET}/bin。 这确保了在不同操作系统下使用不
# 同的安装目录,保持组织性
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
#!isEmpty(target.path): INSTALLS += target: 这部分是关键。它检查 target.path 变量是否为空
#(表示没有分配路径)。如果成功确定了一个路径,则将目标添加到应该被安装的列表中。 这确保了在构建
# 过程中,目标(可执行文件或库)被安装到指定的路径。
!isEmpty(target.path): INSTALLS += target
main.cpp
main.cpp C++ 程序的入口点
cpp
#include "mainwindow.h"
/*QApplication 是 Qt 框架中的一个类,它是 Qt 应用程序的基石,因为它:
管理应用程序的主事件循环: 这对于处理用户输入(鼠标点击、键盘按键等),在屏幕上绘制,以及响应
各种事件至关重要。
提供对应用程序范围资源的访问: 它用于应用程序与窗口系统(例如 Linux 上的 X11 或 Windows API)
的交互,管理显示器等资源,并提供与其他 Qt 对象通信的方式。
处理应用程序的初始化和清理: 它管理应用程序的初始化和终止。
简而言之,没有 QApplication,Qt 应用程序无法运行。你需要包含它才能使用 Qt 的 GUI 功能。*/
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//系统给你创建的窗口类
MainWindow w;
w.show();
/*这是最重要的一部分。a 应该是一个 QApplication 对象(在你的程序中更早创建)。a.exec()
启动了 Qt 事件循环。事件循环是 Qt 应用程序的关键部分。它负责处理应用程序中的所有事件,
例如用户输入(鼠标点击、按键),窗口重绘等等。return 语句返回 a.exec() 的结果,该结果
指示应用程序退出的方式。
总之,这段代码创建了一个主窗口,使其可见,然后进入 Qt 事件循环以处理发生的事件。事件循环保持
应用程序响应且运行,直到用户关闭窗口或应用程序以其他方式终止。没有 a.exec(),主窗口将短暂出
现然后消失。*/
return a.exec();
}
mainwindow主窗口类
cpp
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE 这两个预处理器指令在 Qt 头文件中用于正确地限定
//Ui 命名空间
//QT_BEGIN_NAMESPACE/QT_END_NAMESPACE 确保在访问ui时拥有正确的作用域
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
//Q_OBJECT 是 Qt 中的一个宏,对于任何需要与 Qt 元对象系统交互的类来说都是至关重要的。它是 Qt
// 的信号槽机制、属性系统以及其他依赖于反射功能的关键部分。
//没有 Q_OBJECT,Qt 的信号槽机制、属性以及元对象功能对于该类来说将无法工作。在你的代码中使用
// Qt 的信号槽机制或属性时,你的应用程序很可能会出现故障或崩溃。
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
//Ui::MainWindow *ui; 声明的是一个指向 Qt Designer 生成的 MainWindow 界面类对象的指针。
// 通过 ui 指针,你可以在你的 C++ 代码中访问和操作设计好的界面元素。
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
//它负责将 Qt Designer 设计的界面与 C++ 代码连接起来
/*setupUi 函数做的事情包括:
创建界面元素 (例如按钮、标签) 的实例。
将界面元素放置到合适的容器中 (例如 centralWidget 或其他布局)。
将界面元素的属性 (例如文本、位置、大小) 设置为设计器中的值。
将界面元素的成员变量与 ui 指针指向的 Ui::MainWindow 类的相应成员变量连接起来。
*/
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.ui
双击界面:
文本编辑UI内容
xml
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<!-- 窗口的几何尺寸 -->
<property name="geometry">
<rect>
<x>0</x> <!-- 窗口左上角 x 坐标 -->
<y>0</y> <!-- 窗口左上角 y 坐标 -->
<width>800</width> <!-- 窗口宽度 -->
<height>600</height> <!-- 窗口高度 -->
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string> <!-- 窗口标题 -->
</property>
<widget class="QWidget" name="centralwidget">
<!-- centralwidget 是主窗口的中心区域,一般在此区域放置布局和控件 -->
</widget>
<widget class="QMenuBar" name="menubar">
<!-- 菜单栏,一般用于文件、编辑等功能 -->
</widget>
<widget class="QStatusBar" name="statusbar">
<!-- 状态栏,用于显示程序状态或信息 -->
</widget>
</widget>
<resources/>
<connections/>
</ui>
不知道有没有使用过UI界面库或者html的,是不是感觉这个xml内容很熟悉。