Qt入門之概述

hywing發表於2024-06-10

1.概述

1.1 介紹

  1. Qt:它是一套基於C++的跨平臺開發框架,包括GUI、字串、多執行緒處理、檔案IO、網路IO、3D渲染等
  2. 時間:它誕生於1991年,由Haavard Nord和Eirik Chambe-Eng共同締造
  3. 發展:歷經Qt Company、Nokia、Digia多個公司開發迭代
  4. 版本:由最先的Qt1.40發展到Qt6,其中廣為人知的是Qt4、Qt5、Qt6,Qt4基於QWS,Qt5基於QPA,Qt6基於RHI
  5. 特點:開源、跨平臺、簡單易用(訊號和槽作為訊息機制)、模組可裁剪、支援cmake、程式碼優雅、支援反射機制、屬性機制、半自動記憶體管理
  6. 跨平臺:嵌入式、PC端、移動端,支援部分RTOS平臺
  7. 記憶體管理:採用QOject物件樹機制,父節點管理子節點的生命週期,繼承自QObject的類派生的物件析構時會把子節點全部析構掉
  8. 訊息機制:Qt開創性的在C++裡邊發明了訊號和槽訊息機制,被很多GUI框架借鑑和使用,簡易的通訊機制使得C++編寫GUI不再困難
  9. 反射機制:雖然沒有Java那樣完備的物件發射,但起碼可以動態瞭解物件的property和method,它是透過大量的宏來實現的,比較適合GUI動態解析
  10. 開源:作為一套open source的框架,它的大部分模組license是GPLv2、GPLv3授權的,有少部分是LGPL授權的

1.2 安裝

下面在Windows11環境下安裝Qt6,首先,訪問Qt官方下載網站,下載線上安裝包,這裡最新版本為4.7.0

image

雙擊開啟程式qt-unified-windows-x64-4.7.0-online.exe,輸入Qt Account,沒有的話請自行註冊,接著點選Next

image

Qt開源協議用法及義務頁面,主要是GPL協議的規範,瞭解一下,在兩個核取方塊那裡全都選上,然後點選Next

image

歡迎頁面,沒有啥內容,繼續Next >

image

點選第一個單選框,幫助Qt Creator改進開發中遇到的問題,繼續Next >

image

安裝目錄選擇,繼續Next >

image

勾選安裝元件,我選了Qt6.6.2及Qt Creator兩大元件,這裡先安裝,以後有需要再根據需要重新配置安裝,繼續Next >

image

檢視license,點選勾選框同意相關許可協議,繼續Next >

image

建立開始選單,繼續Next >

image

安裝空間提示需要18.36GB的硬碟空間,繼續Install

image

下載安裝中,這裡需要比較好的網路連線,需要比較久的時間等待安裝完成

image

安裝完成,繼續Next >

image

執行Qt Creator程式,點選Finish

image

1.3 開發環境

視窗功能

image

①:選單欄

②:功能欄,可以切換不同的功能區域

③:除錯執行欄

④:左邊欄,由專案欄、檔案系統等功能區域組成

⑤:工具欄,各種小功能快捷跳轉

⑥:檔案編輯器

⑦:除錯執行資訊輸出區域

⑧:程式碼定位欄

幫助文件

image

①:工具欄

②:左側欄,支援按目錄、索引等方式檢視

③:文件區域

快捷鍵

功能 按鍵組合
開啟檔案 Ctrl + O
關閉檔案 Ctrl + W
關閉所有檔案 Ctrl + Shift + W
儲存所有檔案 Ctrl + Shift + S
編譯所有工程 Ctrl + Shift + B
編譯當前工程 Ctrl + B
執行 Ctrl + R
開始除錯 F5
中斷執行 F5
單步跳過 F10
單步進入 F11
單步跳出 Shift + F11
切換斷點 F9
介面幫助 F1 + F1(兩次F1)
註釋程式碼 Ctrl + /
檢視貼上板 Ctrl + Shift + V
複製 Ctrl + C
貼上 Ctrl + V
剪下 Ctrl + X
切換書籤 Ctrl + M
自動縮排 Ctrl + Shift + I
開啟左側欄 Alt + 0
開啟右側欄 Alt + Shift + 0
上下分割視窗 Ctrl + E + 2
左右分割視窗 Ctrl + E + 3
視窗復原 Ctrl + E + 1
退出軟體 Ctrl + Q

1.4 最小程式

建立工程

點選檔案 -> New Project

image

選擇工程模板

image

填寫工程名和路徑

image

構建工具選擇cmake

image

原始檔命名

image

多語言配置,這裡暫時用不上多語言,所以不選擇

image

勾選編譯工具鏈

image

版本控制,不需要進行配置,點選完成即可

image

工程程式碼

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(HelloQt6 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

set(PROJECT_SOURCES
        main.cpp
        main_window.cpp
        main_window.h
        main_window.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HelloQt6
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET HelloQt6 APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(HelloQt6 SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(HelloQt6
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HelloQt6 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.HelloQt6)
endif()
set_target_properties(HelloQt6 PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS HelloQt6
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HelloQt6)
endif()

main.cpp

#include "main_window.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

main_window.cpp

#include "main_window.h"
#include "./ui_main_window.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

main_window.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

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

main_window.ui

<?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>17</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

直接執行效果

image

1.5 術語

  • GUI:graphic user interface,圖形使用者介面
  • property:物件的屬性,如成員變數
  • method:物件的方法,如成員函式
  • open source:開源
  • GPL:general public license,通用公共許可證
  • LGPL:lesser general public license,寬鬆的通用公共許可證
  • QWS:Qt Window System,Qt視窗系統
  • QPA:Qt Platform Abstraction,Qt平臺抽象
  • RHI:Qt Rendering Hardware Interface,Qt渲染硬體介面

相關文章