CMake中新增Qt模組的合理方法

China Soft發表於2024-09-07

https://www.jianshu.com/p/7eeb6f79a275 轉載自這裡

用CMake來組織的工程中要用Qt首先要設定、找到Qt相關模組。主要是透過find_package這個CMake命令。但網上很多教程都過時了,或者不夠清晰靈活。因為這部分很常用,所以特別用一篇文章把我們目前在生產環境中使用的方法給大家介紹下。

設定Qt庫路徑

Qt版本很多,我們的開發機上一般也裝有多個不同版本的Qt。個人嘗試性的專案一般用最新版的Qt,而真正釋出的產品一般用的是LTS版本Qt(LTS:Long Term Support,長期支援版本,目前最新的LTS是5.9)。

我們的方法是在系統中新增多個環境變數。例如我電腦上裝有4個版本:Qt 5.9.4和Qt5.10.1的32位和64位庫。所以有4個環境變數:

  
環境變數名
QTDIR594 C:\Qt\Qt5.9.4\5.9.4\msvc2015
QTDIR594_64 C:\Qt\Qt5.9.4\5.9.4\msvc2015_64
QTDIR5101 C:\Qt\Qt5.10.1\5.10.1\msvc2015
QTDIR5101_64 C:\Qt\Qt5.10.1\5.10.1\msvc2015_64

然後在CMakeLists中新增:

set(CMAKE_PREFIX_PATH $ENV{QTDIR594})

透過在$ENV{}裡選擇不同的環境變數就可以切換不同的Qt版本。

查詢Qt模組

網上很多CMake查詢Qt方法都是過時的Qt4的方法。現在正確的、最新的方法是:

find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)

Components後面加的就是這個工程中會用到的Qt模組,例如上面就用到了Core、Gui、Qml、Quick這幾個模組,也是一般一個Qt Quick程式必須用到的幾個模組。

開啟相關自動選項

Qt Quick程式中的QRC資原始檔需要用rcc來進行預處理,生成相應.h.cpp檔案。QObject派生的C++類也需要透過moc進行處理。這些都是編譯系統中所謂的Rules。CMake中透過開啟下面兩個選項可以自動對這些字尾的檔案進行相應處理:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

由於生成的C++檔案都是放在編譯目錄裡的(在Shadow Building中有別於原始碼目錄),所以還需要將編譯目錄包含到Include目錄,否則編譯器會找不到這些標頭檔案:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

連結時設定相應模組

最後一步是在連結的時候把用到的Qt庫寫上去:

target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)

這樣就能連結上用到的Qt庫了。

完整的CMake例子

上面只是著重說明了CMake關於新增Qt模組的程式碼,一個完整的CMake例子肯定不止上面這些。下面就貼出一個完整的例子:

複製程式碼
cmake_policy(VERSION 3.9)
project(Demo VERSION 0.1)
cmake_minimum_required(VERSION 3.9)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_PREFIX_PATH $ENV{QTDIR594})
find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)

set(HEADERS 
    appglobal.h
)

set(SOURCES 
    main.cpp
    appglobal.cpp
)

set(RESOURCES 
    qml.qrc
)

set(QMLS
    main.qml
)

add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${RESOURCES} ${QMLS})
target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)
複製程式碼

當需求複雜之後CMake中還會有很多命令,這個以後我們介紹具體技術的時候再講。



作者:吉米有態度
連結:https://www.jianshu.com/p/7eeb6f79a275
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。
複製程式碼
自己寫的例子:
cmake_minimum_required(VERSION 2.8)
project(Demo)
set(CMAKE_PREFIX_PATH /home/qilin64/Qt5.6.0/5.6/)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")
find_package(Qt5 COMPONENTS Core Gui Qml Quick Widgets REQUIRED)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Widgets)
複製程式碼
複製程式碼
qt的模組介紹

Qt 基礎模組分為以下幾個:

o Qt Core,提供核心的非 GUI 功能,所有模組都需要這個模組。這個模組的類包括了動畫框架、定時器、各個容器類、時間日期類、事件、IO、JSON、外掛機制、智慧指標、圖形(矩形、路徑等)、執行緒、XML 等。所有這些類都可以透過  標頭檔案引入。

o Qt Gui,提供 GUI 程式的基本功能,包括與視窗系統的整合、事件處理、OpenGL 和 OpenGL ES 整合、2D 影像、字型、拖放等。這些類一般由 Qt 使用者介面類內部使用,當然也可以用於訪問底層的 OpenGL ES 影像 API。Qt Gui 模組提供的是所有圖形使用者介面程式都需要的通用功能。

o Qt Multimedia,提供影片、音訊、收音機以及攝像頭等功能。這些類可以透過  引入,而且需要在 pro 檔案中新增 QT += multimedia。

o Qt Network,提供跨平臺的網路功能。這些類可以透過  引入,而且需要在 pro 檔案中新增 QT += network。

o Qt Qml,提供供 QML(一種指令碼語言,也提供 JavaScript 的互動機制) 使用的 C++ API。這些類可以透過  引入,而且需要在 pro 檔案中新增 QT += qml。

o Qt Quick,允許在 Qt/C++ 程式中嵌入 Qt Quick(一種基於 Qt 的高度動畫的使用者介面,適合於移動平臺開發)。這些類可以透過  引入,而且需要在 pro 檔案中新增 QT += quick。

o Qt SQL,允許使用 SQL 訪問資料庫。這些類可以透過  引入,而且需要在 pro 檔案中新增 QT += sql。

o Qt Test,提供 Qt 程式的單元測試功能。這些類可以透過  引入,而且需要在 pro 檔案中新增 QT += testlib。

o Qt Webkit,基於 WebKit2 的實現以及一套全新的 QML API(順便說一下,Qt 4.8 附帶的是 QtWebkit 2.2)。

 

Qt 擴充套件模組則有更多的選擇:

o Qt 3D,提供宣告式語法,在 Qt 程式中可以簡單地嵌入 3D 影像。Qt 3D 為 Qt Quick 新增了 3D 內容渲染。Qt 3D 提供了 QML 和 C++ 兩套 API,用於開發 3D 程式。

o Qt Bluetooth,提供用於訪問藍芽無線裝置的 C++ 和 QML API。

o Qt Contacts,用於訪問地址簿或者聯絡人資料庫的 C++ 和 QML API。

o Qt Concurrent,封裝了底層執行緒技術的類庫,方便開發多執行緒程式。

o Qt D-Bus,這是一個僅供 Unix 平臺使用的類庫,用於利用 D-Bus 協議進行程序間互動。

o Qt Graphical Effects,提供一系列用於實現影像特效的類,比如模糊、銳化等。

o Qt Image Formats,支援圖片格式的一系列外掛,包括 TIFF、MNG、TGA 和 WBMP。

o Qt JS Backend,該模組沒有公開的 API,是 V8 JavaScript 引擎的一個移植。這個模組僅供 QtQml 模組內部使用。

o Qt Location,提供定位機制、地圖和導航技術、位置搜尋等功能的 QML 和 C++ API。

o Qt OpenGL,方便在 Qt 應用程式中使用 OpenGL。該模組僅僅為了程式從 Qt 4 移植到 Qt 5 的方便才保留下來,如果你需要在新的 Qt 5 程式中使用 OpenGL 相關技術,需要使用的是 QtGui 模組中的 QOpenGL。

o Qt Organizer,使用 QML 和 C++ API 訪問組織事件(organizer event)。organizer API 是 Personal Information Management API 的一部分,用於訪問 Calendar 資訊。透過 Organizer API 可以實現:從日曆資料庫訪問日曆時間、匯入 iCalendar 事件或者將自己的事件匯出到 iCalendar。

o Qt Print Support,提供對列印功能的支援。

o Qt Publish and Subscribe,為應用程式提供對專案值的讀取、導航、訂閱等的功能。

o Qt Quick 1,從 Qt 4 移植過來的 QtDeclarative 模組,用於提供與 Qt 4 的相容。如果你需要開發新的程式,需要使用 QtQuick 模組。

o Qt Script,提供指令碼化機制。這也是為提供與 Qt 4 的相容性,如果要使用指令碼化支援,請使用 QtQml 模組的 QJS* 類。

o Qt Script Tools,為使用了 Qt Script 模組的應用程式提供的額外的元件。

o Qt Sensors,提供訪問各類感測器的 QML 和 C++ 介面。

o Qt Service Framework,提供客戶端發現其他裝置的服務。Qt Service Framework 為在不同平臺上發現、實現和訪問服務定義了一套統一的機制。

o Qt SVG,提供渲染和建立 SVG 檔案的功能。

o Qt System Info,提供一套 API,用於發現系統相關的資訊,比如電池使用量、鎖屏、硬體特性等。

o Qt Tools,提供了 Qt 開發的方便工具,包括 Qt CLucene、Qt Designer、Qt Help 以及 Qt UI Tools 。

o Qt Versit,提供了對 Versit API 的支援。Versit API 是 Personal Information Management API 的一部分,用於 QContacts 和 vCard 以及 QOrganizerItems 和 iCalendar 之間的相互轉換。

o Qt Wayland,僅用於 Linux 平臺,用於替代 QWS,包括 Qt Compositor API(server)和 Wayland 平臺外掛(clients)。

o Qt WebKit,從 Qt 4 移植來的基於 WebKit1 和 QWidget 的 API。

o Qt Widgets,使用 C++ 擴充套件的 Qt Gui 模組,提供了一些介面元件,比如按鈕、單選框等。

o Qt XML,SAX 和 DOM 的 C++ 實現。該模組已經廢除,請使用 QXmlStreamReader/Writer。

o Qt XML Patterns,提供對 XPath、XQuery、XSLT 和 XML Schema 驗證的支援
複製程式碼

堅持就是勝利

相關文章