CLion開發Qt桌面

IDE:CLion Qt

Qt版本:5.12


? ? ? ? ?學習正點原子的嵌入式Linux開發板時,使用Qt Creator寫代碼不是很方便,遂嘗試使用CLion搭建Qt開發環境。

一、CLion的Qt環境搭建

1,配置工具鏈

? ? ? ? 找到Qt的安裝目錄,此處為E:\Tools\Develop\Embedded\Qt。這里使用mingw64來編譯工程,新建一個MinGW,把工具集的路徑設置為Qt對應的mingw64路徑

????????找到Qt工程的目錄,確保路徑上沒有中文。此處為正點原子imx6ull資料盤里的Qt綜合例程源碼

????????在里面創建一個CMakeLists文件

2,使用CLion打開工程

????????右鍵工程 ,使用CLion打開

? ? ? ? 彈出的界面選擇剛才創建的工具鏈

? ? ? ? 由于創建的CMakeLists中沒有寫任何東西,所以構建時會出問題

二、編寫CMakeLists

1,添加資源文件

? ? ? ? 資源文件和頭文件我們可以從.pro里獲取,或者自己手動打或者使用通配符

????????使用Alt + J 擴選“\”,把“\”刪除。Ctrl +Alt + L格式化文件,使其規整。(后面會給出CMakeLists)

? ? ? ? Qt除了.cpp外還需要.h和.qrc,因為Qt會把.h和.qrc轉為.cpp。由于CMake緩存目錄里也會有.h之類的,故不能直接使用*.h

? ? ? ? 也正是由于Qt編譯的特殊性,它并不需要如一般程序指定頭文件目錄

2,添加Qt庫?

? ? ? ? ?編寫CMakeLists要注意,使用CLion創建Qt程序的CMakeLists有可能會導致庫路徑尋找失敗。比如下圖,使用find_package尋找后,頭也不回的去找python用的虛擬環境Anaconda3的目錄。而且是屢教不改

? ? ? ? 最后編譯的結果就是,頭文件找到了,但鏈接的庫確實python虛擬環境下的Qt庫,會報一堆缺少__imp__*定義的錯誤

????????解決辦法就是在前面指定搜索目錄,定義Qt5_DIR變量這種方法沒有什么效果。如果你的搜索路徑仍不變,那么刪除CMake緩存,重新CMake

? ? ? ? 查找模塊和鏈接模塊總是需要輸入相同的名稱,這里可以先定義一個變量存儲,然后在變量里的名稱添加前綴,即可得到鏈接庫的名稱

3,運行程序?

? ? ? ? 直接運行程序,你會發現報下面錯誤,0xC0000135是很常見的錯誤,即缺少dll

? ? ? ? 我們回到Qt,會發現Qt在運行這一步也直接執行程序,但它不會報錯。這是因為Qt在執行程序時會添加一個環境變量——Qt庫的目錄,這樣程序在運行時就能自動搜索dll,不會報錯了。

????????我們可以在構建目標里添加這個環境變量,點擊紫色$

????????點擊+,然后添加PATH和對應的bin目錄

????????右邊的bin目錄是你所選的Qt庫里的bin

E:\Tools\Develop\Embedded\Qt\5.15.2\mingw81_64\bin

? ? ? ? 確定后再次執行,就可以正常運行了

4,完整CMakeLists

? ? ? ? C++標準可以不指定,后面刪除了復制dll的步驟,改為添加環境變量

cmake_minimum_required(VERSION 3.30)project(QtDesktop)
set(CMAKE_CXX_STANDARD 11)#打開全局moc
set(CMAKE_AUTOMOC ON)
#打開全局uic
set(CMAKE_AUTOUIC ON)
#打開全局rcc,如果沒有使用qrc,此句可以去掉
set(CMAKE_AUTORCC ON)#設置工程包含當前目錄,使用*.ui文件時,需要加上這句,否則找不到頭文件
set(CMAKE_INCLUDE_CURRENT_DIR ON)# ---------添加頭文件目錄----------
#include_directories(
#        cameramedia
#        fileview
#        weather
#        music
#        media
#        wireless
#        tcpclient
#        desktop
#        udpchat
#        photoview
#        iotest
#        sensor
#        iotest
#        radio
#)# ---------添加資源文件----------
file(GLOB_RECURSE SRC"main.cpp""qml.qrc""cameramedia/*.cpp""cameramedia/*.h""desktop/*.cpp""desktop/*.h""fileview/*.cpp""fileview/*.h""iotest/*.cpp""iotest/*.h""media/*.cpp""media/*.h""music/*.cpp""music/*.h""photoview/*.cpp""photoview/*.h""radio/*.cpp""radio/*.h""sensor/*.cpp""sensor/*.h""tcpclient/*.cpp""tcpclient/*.h""tcpserver/*.cpp""tcpserver/*.h""udpchat/*.cpp""udpchat/*.h""weather/*.cpp""weather/*.h""wireless/*.cpp""wireless/*.h"
)# 定義 Qt 模塊名稱
set(QT_MODULESCore Gui WidgetsMultimediaQml Network
)# ------------查找Qt庫------------
set(CMAKE_PREFIX_PATH "E:/Tools/Develop/Embedded/Qt/5.15.2/mingw81_64")
find_package(Qt5 REQUIRED COMPONENTS ${QT_MODULES}
)
# ------------添加可執行文件------------
add_executable(${PROJECT_NAME} ${SRC})
# ------------鏈接Qt庫------------
set(QT_LIBRARIES)
foreach(MODULE ${QT_MODULES})list(APPEND QT_LIBRARIES "Qt5::${MODULE}")
endforeach()
target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES})

三、添加外部工具

1,Designer

? ? ? ? 打開設置,找到外部工具,再點擊+添加工具,desinger程序是在你所用的Qt庫的bin目錄(前面的環境變量也是這個)

? ? ? ? 傳入的實參就是需要運行的文件名,工作目錄選擇工程目錄

$FileName$
$ProjectFileDir$

2,UIC

? ? ? ? 與前面相同,再添加一個外部工具Qt?UIC,它的目的是把.ui文件轉為.h文件。所以這里的實參,是把.ui文件輸出為.h。

? ? ? ? 所謂實參就是給外部工具傳入的參數,下面這一句等價為在命令行里輸入

uic?$FileName$ -o ui_$FileNameWithoutExtension$.h

里面的變量名會被替換為具體的文件名

$FileName$ -o ui_$FileNameWithoutExtension$.h
$FileDir$

? ? ? ? 實際上前面在CMakeLists里開啟了自動UIC,它會自動把添加進來的ui文件轉為.h。此外,正點原子這個工程使用的是Qt Quick?技術棧,并非Qt Widgets,事實上是用不到UIC的

3,使用

? ? ? ? 使用時,可以右鍵對應文件,選擇對應的外部工具

?4,QMLSCENE(預覽QML)

? ? ? ? 這個工具挺有用的,是預覽qml文件用的,此工具是位于Qt庫里的qmlscence.exe

E:\Tools\Develop\Embedded\Qt\5.15.2\mingw81_64\bin\qmlscene.exe
$FileName$
$FileDir$

?

? ? ? ? 需要說明一點,正點原子的相關例程里,由于qml會導入一些別的資源,那么這個預覽工具就不能正常預覽了,它適合單個無依賴文件或者依賴都在同一個目錄

5,設計無法開啟

? ? ? ? 剛使用Qt Creator時,左邊欄中【設計】是灰的,這需要開啟一個插件,然后重啟

? ? ? ? 點擊上面的【幫助】,然后點擊【關于插件】,把QmlDesigner勾選上,確定后再重啟

? ? ? ? 接下來就可以自由切換編輯和設計模式了

? ? ? ? 在【編輯】->【偏好選項】里找到Qt Quick,可以選擇默認打開Qt Design Studio

? ? ? ? 界面元素設計這塊,還是Qt Creator比較好用,可以無縫銜接Qt Design Studio

四、使用Qt Creator原生工具

? ? ? ? 除了使用CMake構建外,也可以通過外部工具的方法來使用Qt Creator配置好的構建工具和命令。不過實際使用過程中,反應巨慢,提示信息又很反人類,還不如直接使用Qt Creator。不建議使用,但可以作為興趣了解一下。

1,Qt Creator的構建運行過程

? ? ? ? Qt Creator的構建和運行都在項目配置里寫好的,在下圖的項目配置界面,可以看到構建這個步驟實際上是分為兩步執行的,qmake和make步驟

? ? ? ? 把qmake步驟展開,可以看到下面調用

E:/Tools/Develop/Embedded/Qt/5.15.2/mingw81_64/bin/qmake.exe E:\Program\Embedded\Qt\imx6ull\QDesktop\QDesktop.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug" && E:/Tools/Develop/Embedded/Qt/Tools/mingw810_64/bin/mingw32-make.exe qmake_all

? ? ? ? 這個調用過程看起來只有qmake這個過程,實際上還有make過程,從命令里可以看到“&&”符號,這個在終端調用里會把前面兩個程序運行都執行。不過如果放在CLion的外部工具或者構建命令里,是不能使用"&&"的,因為對于它來說,一個外部工具或者構建命令只能運行一個程序,實參里一般是不允許再運行別的程序,除非這個外部工具是終端

? ? ? ? 所以qmake步驟實際是有下面兩個過程

  • 先qmake生成Makefile
qmake.exe E:\Program\Embedded\Qt\imx6ull\QDesktop\QDesktop.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug" 
  • 再使用make構建qmake_all目標
mingw32-make.exe qmake_all

? ? ? ? 至于下面這個make步驟要做的事情很簡單,編譯all目標,“in”及“in”后面的內容并不是參數,只是告訴你在哪個目錄。

make -j16

? ? ? ? 清理步驟與前面的make all一樣,清晰明了

? ? ? ? 運行步驟前面說過,添加了一個環境變量用于檢索dll

2,CLion自定義構建目標

? ? ? ? 從前面的分析可知,構建過程可以拆分為三個步驟,qmake生成Makefile、make執行qmake_all目標、make執行all目標,清理步驟只有一個目標,即make執行clean目標

? ? ? ? 先在構建目標里找到自定義構建應用程序

? ? ? ? 前面分析過構建有三個目標,我們要確保最后一個是make all,不然沒法編譯源文件。也就是說構建要做的事情是make all,那么其他兩個步驟需要放在構建前,我們在下面的【執行前】添加一個運行外部工具

? ? ? ? 先添加一個qmake,用于生成Makefile,程序是所選Qt庫bin目錄里的程序,實參就是前面Qt Creator里qmake執行的命令。工作目錄會在選擇程序后默認為程序所在目錄,由于已經指定了.pro文件,那么這個工作目錄可以不用改

E:\Program\Embedded\Qt\imx6ull\QDesktop\QDesktop.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug"

????????再添加一個外部工具,用于執行make qmake_all。這個make命令是需要在前面生成的Makefile的目錄執行,我們可以在make后加一個參數"-C"來指定工作目錄,或者直接把工具目錄改為MakeFile所在目錄

-C E:\Program\Embedded\Qt\imx6ull\QDesktop\build\Desktop_Qt_5_15_2_MinGW_64_bit-Debug qmake_all

????????添加好外部工具之后,記得順序不能亂,我們要使用的這兩個外部工具,qmake是在前面的

????????點擊確定后,把這個運行外部工具給放到構建前面

????????接下來是添加構建目標,點擊這個【配置自定義構建目標】,這里已經提前配置過了,所以會有一個目標

? ? ? ? 配置的這個目標,使用的工具鏈是前面配置過的,構建目標和清理目標就是make -j16和make clean -j16

? ? ? ? 點擊旁邊的三點,添加外部工具,與前面一致,這里就不贅述了

????????添加可執行文件這一步,就添加build目錄的QDesktop程序,環境變量與前面一樣,添加Qt庫bin目錄。

? ? ? ? 需要注意的是,我們這里只是簡單配置,所以不會自動生成build相關目錄,如果沒有在Qt Creator里預先構建一遍的話,這里運行這個自定義目標會提示缺少目錄什么的。

? ? ? ? 最后我們構建這個目標,從提示信息里就可以窺視到,這完全就是按照Qt Creator的路子走一遍(當然下面檢測到了項目沒有做任何改變)

? ? ? ? 我們在main里隨便定義一個變量

????????哪怕這個變量人畜無害,也會羅里吧嗦給出一堆警告(不是報錯),當然這可能是生成的Makefile里開了-Wall

????????運行與前面相同,只不過它會在運行前堅定地指定構建三步驟

? ? ? ? 除了按部就班地使用自定義構建目標外,也可以通過CMakeLists里添加自定義命令達到一樣的效果,并且CMakeLists里有更豐富的命令,比如檢測目錄是否存在等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67123.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【學術會議-第五屆機械設計與仿真國際學術會議(MDS 2025) 】前端開發:技術與藝術的完美融合

重要信息 大會官網:www.icmds.net 大會時間:2025年02月28日-03月02日 大會地點:中國-大連 會議簡介 2025年第五屆機械設計與仿真國際學術會議(MDS 2025) 將于2025年02月28-3月02日在中國大連召開。MDS 2025將圍繞“機械設計”…

《DeepSeek R1:開源大模型的破局者》

驚爆!中國開源大模型震撼登場 在人工智能領域的激烈競爭中,一場震撼全球的技術革命正悄然發生。2025 年 1 月 20 日晚,一家來自中國的人工智能初創公司 ——DeepSeek(深度求索),如同一顆耀眼的新星&#x…

84,【8】BUUCTF WEB [羊城杯 2020]Blackcat

進入靶場 音樂硬控我3分鐘 回去看源碼 <?php // 檢查 POST 請求中是否包含 Black-Cat-Sheriff 和 One-ear 字段 // 如果任意一個字段為空&#xff0c;則輸出錯誤信息并終止腳本執行 if(empty($_POST[Black-Cat-Sheriff]) || empty($_POST[One-ear])){die(請提供 Black-C…

人工智能:從基礎到前沿

目錄 目錄 1. 引言 2. 人工智能基礎 2.1 什么是人工智能&#xff1f; 2.2 人工智能的歷史 2.3 人工智能的分類 3. 機器學習 3.1 機器學習概述 3.2 監督學習 3.3 無監督學習 3.4 強化學習 4. 深度學習 4.1 深度學習概述 4.2 神經網絡基礎 4.3 卷積神經網絡&#…

漏洞情報:為什么、要什么和怎么做

漏洞一直是網絡攻防的焦點所在&#xff0c;因為漏洞直接或間接影響安全性的核心方面——權限。攻擊者挖掘和利用漏洞&#xff0c;獲取非授權的權限&#xff1b;防御方定位和消除漏洞&#xff0c;監測和阻斷漏洞的利用&#xff0c;使攻擊者無法利用漏洞達到其目的。漏洞信息本質…

leetcode——刪除鏈表的倒數第N個節點(java)

給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 輸入&#xff1a;head [1], n 1 輸出&#xff1a;[] 示例 3&#xf…

正則表達式以及Qt中的使用

目錄 一、正則表達式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .運算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重復次數&#xff1a; 2.4 量詞{} 2.5 特征標群() 2.6 或運算符 2.7 \反斜線轉碼特殊字符 2.8 錨點 3、簡寫字符 4、零寬度斷言 4.1 正…

【第一天】零基礎入門刷題Python-算法篇-數據結構與算法的介紹(持續更新)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、Python數據結構與算法的詳細介紹1.基本概念2.Python中的數據結構1. 列表&#xff08;List&#xff09;2. 元組&#xff08;Tuple&#xff09;3. 字典&#…

流行的開源高性能數據同步工具 - Apache SeaTunnel 整體架構運行原理

概述 背景 數據集成在現代企業的數據治理和決策支持中扮演著至關重要的角色。隨著數據源的多樣化和數據量的迅速增長&#xff0c;企業需要具備強大的數據集成能力來高效地處理和分析數據。SeaTunnel通過其高度可擴展和靈活的架構&#xff0c;幫助企業快速實現多源數據的采集、…

消息隊列篇--原理篇--Pulsar(Namespace,BookKeeper,類似Kafka甚至更好的消息隊列)

Apache Pulusar是一個分布式、多租戶、高性能的發布/訂閱&#xff08;Pub/Sub&#xff09;消息系統&#xff0c;最初由Yahoo開發并開源。它結合了Kafka和傳統消息隊列的優點&#xff0c;提供高吞吐量、低延遲、強一致性和可擴展的消息傳遞能力&#xff0c;適用于大規模分布式系…

VS Code i18n國際化組件代碼code顯示中文配置 i18n ally

VUE項目做i18n國際化之后&#xff0c;代碼中的中文都變成了code這時的代碼就會顯得非常難讀&#xff0c;如果有一個插件能把code轉換成中文顯示就好了 vscode插件搜索“i18n ally” 在項目根文件夾下創建文件&#xff1a;.vscode/settings.json settings.json 內容如下 {"…

圖論匯總1

1.圖論理論基礎 圖的基本概念 二維坐標中&#xff0c;兩點可以連成線&#xff0c;多個點連成的線就構成了圖。 當然圖也可以就一個節點&#xff0c;甚至沒有節點&#xff08;空圖&#xff09; 圖的種類 整體上一般分為 有向圖 和 無向圖。 有向圖是指 圖中邊是有方向的&a…

為什么機器學習中梯度下降是減去斜率,而不是按照其數學意義減去斜率的倒數

做個簡單假設&#xff0c;Loss函數的某一個參數的函數曲線是二次方程&#xff0c;其導數函數為 r 2 ? w r 2*w r2?w 按照斜率意義來看&#xff0c;要減去斜率倒數 降低LOSS需要將w1更新為w2&#xff0c;所以更新公式為 w w ? Δ L Δ w w w - \frac{\Delta L}{\Delta w…

iptables和ipvs差異

iptables和ipvs都是Linux內核中用于網絡流量管理的工具&#xff0c;它們在實現方式、功能、性能以及使用場景上存在一些顯著的差異。以下是對兩者的詳細比較&#xff1a; 一、實現方式 iptables&#xff1a; 基于Netfilter框架。使用鏈表&#xff08;chain&#xff09;和規則&…

Effective C++ 規則51:編寫 new 和 delete 時需固守常規

1、背景 在 C 中&#xff0c;如果你需要為類自定義 new 和 delete&#xff0c;必須遵循一些約定和規則&#xff0c;以確保內存管理的一致性、可維護性和安全性。當我們使用 new 和 delete 操作時&#xff0c;C 編譯器會&#xff1a; 調用全局或類特定的 operator new 來分配內…

JS面相對象小案例:自定義安全數組

在JS中&#xff0c;數組不像其他語言&#xff08;java、python&#xff09;中那樣安全&#xff0c;它具有動態性和弱類型性&#xff0c;切越界訪問沒有具體的報錯&#xff0c;而是返回空&#xff0c;為提升數組的安全性&#xff0c;我們可以自行定義一個安全數組。 一、增加報…

本地大模型編程實戰(02)語義檢索(2)

文章目錄 準備按批次嵌入加載csv文件&#xff0c;分割文檔并嵌入測試嵌入效果總結代碼 上一篇文章&#xff1a; 本地大模型編程實戰(02)語義檢索(1) 詳細介紹了如何使用 langchain 實現語義檢索&#xff0c;為了演示方便&#xff0c;使用的是 langchain 提供的內存數據庫。 在實…

windows平臺intel-vpl編譯

需要先在本機編譯好opencl庫 git clone --recursive https://github.com/KhronosGroup/OpenCL-SDK.git cmake -A x64 -T v143 -D OPENCL_SDK_BUILD_OPENGL_SAMPLESOFF -B OpenCL-SDK\build -S OpenCL-SDKcmake --build OpenCL-SDK\build --config Releasecmake --install O…

Vue 3 30天精進之旅:Day 05 - 事件處理

引言 在前幾天的學習中&#xff0c;我們探討了Vue實例、計算屬性和偵聽器。這些概念為我們搭建了Vue應用的基礎。今天&#xff0c;我們將專注于事件處理&#xff0c;這是交互式Web應用的核心部分。通過學習如何在Vue中處理事件&#xff0c;你將能夠更好地與用戶進行交互&#…

[C語言日寄]exit函數的使用及其拓展

【作者主頁】siy2333 【專欄介紹】?c語言日寄?&#xff1a;這是一個專注于C語言刷題的專欄&#xff0c;精選題目&#xff0c;搭配詳細題解、拓展算法。從基礎語法到復雜算法&#xff0c;題目涉及的知識點全面覆蓋&#xff0c;助力你系統提升。無論你是初學者&#xff0c;還是…