3

学习QT之解决方案和项目结构

 1 year ago
source link: http://blog.devwiki.net/2022/08/11/study-qt-project-struct.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文使用QT5创建工程, 具体版本为 QT5.14.2, 包含的 QT Creator 为 4.11.1

1. 创建默认QT工程

1. 打开 QT Creator(4.11.1 社区版) , 文件 -> 新建:

image-202205031743525
image-202205031743525

2. 设置项目名称和选择存放路径:

image-20220503220815575
image-20220503220815575

3. 选择 Build System

此处可选的有:

  • CMake :
  • qmake :

此处先使用默认项.

image-20220503174457898
image-20220503174457898

4. 设置主窗口的信息:

  • class name 及 base class
  • header file 及 source file
  • 主窗口ui : mainwindow.ui

image-20220503174654805
image-20220503174654805

5. 选择默认使用本地语言

此处选择了"简体中文", 后续可增加配置

image-20220503221151462
image-20220503221151462

6. 选择编译套件 Kits:

image-20220503221222185
image-20220503221222185

7. 最后预览项目, 可选择 git 作为版本选择

image-20220503221243586
image-20220503221243586

完成后默认为 编辑 main.cpp界面:

image-20220503233226039
image-20220503233226039

点击左下角的运行 或者 Ctrl + R, 运行项目, 可看到一个空界面的 App:

image-20220503181200390
image-20220503181200390

2. 项目目录及文件

在 "编辑" 一栏中可看到项目目录及文件:

image-20220503233247821
image-20220503233247821

概要说明如下:

FirstQt5 : 项目名称及git分支

- CMakeList.txt : CMakeList内容
- FirstQt5 : 工程名称
  - Header Files : 头文件目录
    - mainwindow.h : 主窗口头文件
  - Source Files : 源文件目录
    - main.cpp : QT App应用入口源文件
    - mainwindow.cpp : 主窗口源文件
  - FirstQT_zh_CN.ts : (此文件在文件管理中可看到)项目本地化语言文件,此处为 zh_CN 简体中文文件
  - mainwindow.ui : 主界面的ui, 可使用界面化鼠标操作
- CMake Modlues : CMake 模块 QT安装目录
  - <Other Location>
    - C:\QT

如果我们创建项目的时候不勾选 "Generate form", 如下图:

image-20220504183757825
image-20220504183757825

则项目结构如下, 少了一个 mainwindow.ui,

image-20220504184034842
image-20220504184034842

2.1 CMakeList.txt 文件

文件内容如下, 文件内容直接在下面使用注释说明.

# cmake 最低要求版本 3.5, 测试电脑安装为 3.23.1
cmake_minimum_required(VERSION 3.5)
# 项目配置
project(FirstQt5 LANGUAGES CXX)
# CMAKE配置项: 包含当前目录 on
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# CMAKE配置项: 是否为Qt目标自动处理 uic 
set(CMAKE_AUTOUIC ON)
# CMAKE配置项: 是否为Qt目标自动处理 moc
set(CMAKE_AUTOMOC ON)
# CMAKE配置项: 是否为Qt目标自动处理 rcc
set(CMAKE_AUTORCC ON)
# 要求构建这个目标的C++标准的特征版本 C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.

#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
#    endif()
#endif()

# 查找package
find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)
# 设置变量 TS_FILES 为 FirstQt5_zh_CN.ts 语言文件
set(TS_FILES FirstQt5_zh_CN.ts)
# 添加包含的文件
if(ANDROID)
  add_library(FirstQt5 SHARED
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
    ${TS_FILES}
  )
else()
  add_executable(FirstQt5
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
    ${TS_FILES}
  )
endif()
# 将目标文件与库文件进行链接
target_link_libraries(FirstQt5 PRIVATE Qt5::Widgets)
# 处理给定的源文件(目录或单个文件)以生成Qt Linguist .ts文件, 其中 CMAKE_SOURCE_DIR 为工程顶层目录
qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})

2.2 Source Files

源文件包含两个:

  • main.cpp : qt 应用的主函数入口
  • mainwindow.cpp : 应用的主窗口

其中 main.cpp 如下:

// mainwindow.h 文件是我们自己创建的,引入时用" "双引号括起来
#include "mainwindow.h"
// QApplication 是 Qt 提供给我们的,引入时用<>括起来
#include <QApplication>
// main() 函数是应用程序的入口。它的主要功能是创建应用程序,创建窗口,显示窗口,并运行应用程序,开始应用程序的消息循环和事件处理。
// argc : 命令行变量的数量
// argv : 命令行变量数组
int main(int argc, char *argv[])
{
    // 定义并创建应用程序
    QApplication a(argc, argv);
    // 定义并创建窗口
    MainWindow w;
    // 显示窗口
    w.show();
    // 应用程序运行, 开始应用程序的消息循环和事件处理
    return a.exec();
}

2.3 mainwindow代码

如果是创建项目时没有勾选创建 ui, 则mainwindow.hmainwindow.cpp内容如下:

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
    // 定义好的宏 Q_OBJECT, 所有需要“信号和槽”功能的组件都必须将 Q_OBJECT 作为 private 属性成员引入到类中
    Q_OBJECT
public:
    //带参的构造函数:QWidget 是所有组件的基类,借助 parent 指针,可以为当前窗口指定父窗口
    MainWindow(QWidget *parent = 0);
    // 无参构造函数
    ~MainWindow();
};
#endif // MAINWINDOW_H

//mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}
MainWindow::~MainWindow()
{
}

而创建项目时勾选创建 ui, 则mainwindow.hmainwindow.cpp内容如下:

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    // 定义好的宏 Q_OBJECT, 所有需要“信号和槽”功能的组件都必须将 Q_OBJECT 作为 private 属性成员引入到类中
    Q_OBJECT

public:
     //带参的构造函数:QWidget 是所有组件的基类,借助 parent 指针,可以为当前窗口指定父窗口
    MainWindow(QWidget *parent = nullptr);
    // 无参构造函数
    ~MainWindow();

private:
    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)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//mainwindow.ui

相比较上面的无 ui 的项目,多了 mainwindow.ui 的定义,其中mainwindow.ui是可以鼠标操作的ui设计窗口,

image-20220504185107475
image-20220504185107475

其代码部分如下, 代码部分不能直接编辑, 只能使用设计器修改.

<?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>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget"/>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

折叠代码我们得到如下:

image-20220811195535788
image-20220811195535788

从代码部分可获取如下信息:

  1. ui 标签 : 表示当前文件为 ui 的布局信息文件以及使用的版本
  2. class 标签 : 表示当前布局对应的类名 MainWindow
  3. widget 标签 : 表示一个 widget, 其中 class 为其类型QWindow, name 为其名称 MainWindow, 其包含了三个子 widget:
    • QWidget
    • QMenuBar
    • QStatusBar
  4. property 标签 : 表示一个属性信息, 在MainWindow widget中,设置了 geometrywindowTitle 属性, 对应为 QMainWindow 父类的 QWidget 类的 geometry : QRect 和 windowTitle : QString
  5. resources 标签 : 表示引入的资源
  6. **connections 标签 ** : 表示链接的内容

至此, QT创建的默认项目结构了解完毕, 后续会进一步学习QT开发.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK