Qt c++ (一)创建一个APP

安装和第一个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内容很熟悉。

相关推荐
Yang.992 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王2 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_2 小时前
C++自己写类 和 运算符重载函数
c++
六月的翅膀2 小时前
C++:实例访问静态成员函数和类访问静态成员函数有什么区别
开发语言·c++
liujjjiyun3 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥3 小时前
c++中mystring运算符重载
开发语言·c++·算法
天若有情6734 小时前
c++框架设计展示---提高开发效率!
java·c++·算法
Root_Smile4 小时前
【C++】类和对象
开发语言·c++
Reese_Cool4 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法