前言
在現(xiàn)代軟件開發(fā)中,跨平臺的圖形用戶界面(GUI)和可視化功能已經(jīng)變得非常重要。Qt和Qt Quick(基于QML)是強大而靈活的工具,可以幫助開發(fā)者快速構(gòu)建出色的應(yīng)用程序。然而,當(dāng)你已經(jīng)有一個基于C++和CMake的工程時,將Qt和Qt Quick引入可能需要一些指導(dǎo)。
本教程將幫助具有C++和CMake基礎(chǔ)知識的開發(fā)者將Qt和Qt Quick引入現(xiàn)有的CMake工程。我們將介紹如何設(shè)置CMakeLists.txt文件以便使用Qt模塊,以及如何在C++和QML代碼中實現(xiàn)跨語言的交互。通過本教程,你將能夠?qū)t和Qt Quick應(yīng)用到你的項目中,創(chuàng)建出富有吸引力的用戶界面和可視化效果。
QML簡介
QML是Qt的一種聲明式編程語言,用于設(shè)計和實現(xiàn)跨平臺的用戶界面。與Qt Widgets相比,QML具有以下優(yōu)勢:
- 簡潔的語法:QML具有簡潔、易讀的語法,使得創(chuàng)建和修改用戶界面變得非常直觀。它允許你以更少的代碼實現(xiàn)相同的功能,從而提高開發(fā)效率。
- 強大的動畫和特效支持:QML內(nèi)置了豐富的動畫和特效支持,使得創(chuàng)建具有吸引力的用戶界面變得更加容易。你可以方便地為界面元素添加動畫效果,提高用戶體驗。
- 跨平臺兼容性:QML可以很好地支持不同平臺和設(shè)備,使得跨平臺應(yīng)用開發(fā)變得更加容易。使用QML,你可以為桌面、移動和嵌入式設(shè)備創(chuàng)建統(tǒng)一的用戶界面。
- 面向?qū)ο蟮木幊?/strong>:QML支持面向?qū)ο缶幊?,允許你創(chuàng)建可重用的組件和模塊。這有助于提高代碼的模塊化和可維護性。
- 與C++的緊密集成:QML可以輕松地與C++代碼進行集成,允許你在QML界面中使用C++實現(xiàn)的功能。這使得QML非常適合與現(xiàn)有的C++項目一起使用。
盡管QML具有這些優(yōu)勢,但它并不總是比Qt Widgets更容易實現(xiàn)。實際上,兩者之間的難易程度取決于你的需求和經(jīng)驗。Qt Widgets在某些場景下可能更適用,尤其是對于傳統(tǒng)的桌面應(yīng)用程序,以及對性能要求較高的場景。
總的來說,QML在許多方面具有優(yōu)勢,但你應(yīng)該根據(jù)項目需求和個人喜好來選擇最適合的技術(shù)。如果你對QML感興趣,我建議你嘗試使用它來實現(xiàn)一些簡單的項目,以便更好地了解它的特點和優(yōu)勢。
鍛煉C++水平
- 使用Qt Widgets:雖然QML是一種強大的界面設(shè)計語言,但使用Qt Widgets同樣可以創(chuàng)建出優(yōu)秀的界面,同時更多地使用C++代碼。通過使用Qt Widgets,你可以在實際項目中應(yīng)用和提高C++編程技能。
- 將C++和QML結(jié)合:QML和C++可以很好地集成在一起。你可以使用C++編寫應(yīng)用程序的核心邏輯和算法,然后將這些功能暴露給QML以在用戶界面中使用。這樣,你既能鍛煉C++編程能力,又能學(xué)習(xí)QML的使用方法。
- 參與開源項目:加入一個使用C++的開源項目,可以讓你在實際項目中應(yīng)用和提高C++編程技能。參與開源項目可以幫助你了解更多關(guān)于C++的最佳實踐和技巧,同時還能擴展你的技術(shù)網(wǎng)絡(luò)。
- 閱讀C++相關(guān)書籍和教程:閱讀高質(zhì)量的C++書籍和教程可以幫助你深入了解C++語言的特性和最佳實踐。一些經(jīng)典的C++書籍,如《Effective C++》、《C++ Primer》和《The C++ Programming Language》,都是值得一讀的好書。
- 解決編程挑戰(zhàn)和問題:在網(wǎng)上尋找C++編程挑戰(zhàn)和問題,例如LeetCode、HackerRank等平臺上的編程題目。這些挑戰(zhàn)可以幫助你鍛煉編程能力,提高解決問題的速度和效率。
- 學(xué)習(xí)C++新特性:C++語言一直在不斷發(fā)展,新的標(biāo)準(zhǔn)和特性會定期推出。關(guān)注并學(xué)習(xí)這些新特性,可以讓你保持C++知識的更新,同時提高編程能力。
通過采取這些策略,你可以在實際項目中鍛煉和提高C++編程技能。同時,學(xué)習(xí)QML可以幫助你更好地應(yīng)對不同類型的項目需求,讓你在軟件開發(fā)領(lǐng)域具有更強的競爭力。祝你在C++和QML的學(xué)習(xí)過程中取得好成績!
cmake修改方法
方式一(qt6_add_resources)
要將現(xiàn)有的C++ CMake工程引入Qt6環(huán)境并使用Qt和QML,你需要執(zhí)行以下步驟:
- 安裝Qt6:如果你還沒有安裝Qt6,請從官方網(wǎng)站下載并安裝。確保你安裝了Qt6的CMake模塊。
-
修改CMakeLists.txt:在你的C++ CMake工程中,打開
CMakeLists.txt
文件。首先,確保找到Qt6包,然后鏈接到需要的Qt6模塊。例如,如果你需要使用Qt6 Core、Gui和Quick模塊,可以添加以下內(nèi)容:
然后,將這些模塊鏈接到你的目標(biāo)(例如,你的可執(zhí)行文件):find_package(Qt6 COMPONENTS Core Gui Quick REQUIRED)
target_link_libraries(your_target_name PRIVATE Qt6::Core Qt6::Gui Qt6::Quick)
-
添加QML文件:在工程目錄下創(chuàng)建一個QML文件夾,將所有QML文件放在該文件夾中。然后,在
CMakeLists.txt
中使用file(GLOB ...)
命令將這些文件添加到工程中。例如:
將QML文件添加到可執(zhí)行文件的資源文件中:file(GLOB QML_FILES qml/*.qml)
qt6_add_resources(your_target_name "qml" PREFIX "/" FILES ${QML_FILES} )
-
創(chuàng)建主入口:在你的C++工程中創(chuàng)建一個
main.cpp
文件(如果尚未創(chuàng)建),并添加以下代碼以設(shè)置Qt和QML環(huán)境:#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
-
注冊C++類:在
main.cpp
中,使用qmlRegisterType
函數(shù)注冊你的C++類,使其可以在QML中使用。例如:
然后在QML文件中,可以通過以下方式導(dǎo)入和使用你的C++類:qmlRegisterType<YourCppClass>("com.example.yourclassname", 1, 0, "YourCppClass");
import com.example.yourclassname 1.0 YourCppClass { // ... }
- 編譯和運行:現(xiàn)在你的C++ CMake工程已經(jīng)集成了Qt6和QML,你可以編譯和運行它。如果一切正常,你應(yīng)該可以看到你的QML界面。
方式二 (qt_add_qml_module )
當(dāng)然,你也可以使用qt_add_qml_module
函數(shù)在CMake項目中添加QML模塊。這是一個簡化了QML資源添加的便捷方法。下面是如何使用qt_add_qml_module
的步驟:
- 安裝Qt6:如果你還沒有安裝Qt6,請從官方網(wǎng)站下載并安裝。確保你安裝了Qt6的CMake模塊。
-
修改CMakeLists.txt:在你的C++ CMake工程中,打開
CMakeLists.txt
文件。首先,確保找到Qt6包,然后鏈接到需要的Qt6模塊。例如,如果你需要使用Qt6 Core、Gui和Quick模塊,可以添加以下內(nèi)容:
然后,將這些模塊鏈接到你的目標(biāo)(例如,你的可執(zhí)行文件):find_package(Qt6 COMPONENTS Core Gui Quick REQUIRED)
target_link_libraries(your_target_name PRIVATE Qt6::Core Qt6::Gui Qt6::Quick)
- 添加QML文件:在工程目錄下創(chuàng)建一個QML文件夾,將所有QML文件放在該文件夾中。
-
使用qt_add_qml_module:在
CMakeLists.txt
中,使用qt_add_qml_module
函數(shù)將QML文件添加到工程中。例如:
其中qt_add_qml_module(your_target_name URI com.example.yourclassname VERSION 1.0 QML_FILES qml/main.qml )
your_target_name
是你的可執(zhí)行文件的目標(biāo)名稱,URI
指定了模塊的標(biāo)識符,VERSION
設(shè)置了模塊的版本,QML_FILES
列出了所有的QML文件。 -
創(chuàng)建主入口:在你的C++工程中創(chuàng)建一個
main.cpp
文件(如果尚未創(chuàng)建),并添加以下代碼以設(shè)置Qt和QML環(huán)境:#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/qml/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
-
注冊C++類:在
main.cpp
中,使用qmlRegisterType
函數(shù)注冊你的C++類,使其可以在QML中使用。例如:
然后在QML文件中,可以通過以下方式導(dǎo)入和使用你的C++類:qmlRegisterType<YourCppClass>("com.example.yourclassname", 1, 0, "YourCppClass");
import com.example.yourclassname 1.0 YourCppClass { // ...
其他相關(guān)知識
為什么會有<target_name>_other_files?
這個問題是因為 qt_add_qml_module
函數(shù)在將 QML 文件添加到項目時,會創(chuàng)建一個名為 <target_name>_other_files
的輔助目標(biāo)。這個輔助目標(biāo)是用于在 Qt Creator 中顯示 QML 文件和其他相關(guān)文件。這個目標(biāo)對于構(gòu)建過程沒有影響,也不會生成任何二進制文件。它只是為了在 Qt Creator 中提供更好的文件組織和顯示。
qt_standard_project_setup() 函數(shù)
qt_standard_project_setup()
函數(shù)。這個函數(shù)會在內(nèi)部配置 CMake 以便為 Qt 項目生成一個更簡潔的目錄結(jié)構(gòu),這意味著它會自動處理 QML 模塊和資源的添加,而不會生成額外的輔助目標(biāo)。
qt_standard_project_setup()
函數(shù)在調(diào)用 qt_add_qml_module()
之前已經(jīng)為項目配置了資源管理,所以你沒有看到任何 <target_name>_other_files
目標(biāo)。
如果你想在自己的項目中使用類似的設(shè)置,可以嘗試在調(diào)用 find_package()
和 add_executable()
之后添加 qt_standard_project_setup()
函數(shù)。這樣,你可以得到一個更簡潔的目錄結(jié)構(gòu),同時保留 Qt Creator 的 QML 模塊管理功能。
請注意,qt_standard_project_setup()
函數(shù)是 Qt 的一個實驗性功能,未來版本的 Qt 可能會對其進行更改或移除。在使用這個函數(shù)時,請確保你了解其實現(xiàn)細節(jié),并準(zhǔn)備好在將來的 Qt 版本中進行必要的調(diào)整。
qt_add_qml_module() 和 qt6_add_resources()的方式差異
qt_add_qml_module()
和 qt6_add_resources()
都可以將 QML 文件和其他資源添加到項目中,但它們的功能和目標(biāo)有所不同:
-
qt_add_qml_module()
:- 是為了簡化 QML 模塊的創(chuàng)建和管理而設(shè)計的。
- 自動生成 QRC 文件。
- 可以指定模塊的 URI 和版本,這對于在項目中使用 QML 模塊很有用。
- 會創(chuàng)建一個名為
<target_name>_other_files
的輔助目標(biāo),用于在 Qt Creator 中顯示 QML 文件和其他相關(guān)文件,以便于查看和管理。 - 更適合用于包含 QML 模塊的項目,可以自動處理 QML 模塊的注冊和資源管理。
-
qt6_add_resources()
:- 是一個更通用的函數(shù),用于將資源(如圖像、文本文件等)添加到項目中。
- 需要手動創(chuàng)建 QRC 文件。
- 不會創(chuàng)建
<target_name>_other_files
輔助目標(biāo),因此在 Qt Creator 中不會有額外的文件顯示。 - 適用于不需要 QML 模塊特性的項目,或者需要更細粒度控制資源管理的項目。
總的來說,如果你的項目需要使用 QML 模塊并希望簡化模塊的創(chuàng)建和管理,建議使用 qt_add_qml_module()
。如果你的項目只需要將 QML 文件和其他資源添加到項目中,而不需要使用 QML 模塊特性,或者希望有更多的控制權(quán),那么 qt6_add_resources()
是一個更好的選擇。
const QUrl url(u"qrc:///Main.qml"_qs);和const QUrl url(QStringLiteral(“qrc:///Main.qml”));的區(qū)別
兩者之間的主要區(qū)別在于字符串字面值的表示方法和編碼:
-
const QUrl url(u"qrc:///Main.qml"_qs);
這里,
u
前綴表示該字符串字面值為一個 UTF-16 編碼的 Unicode 字符串。字符串后面的_qs
用戶自定義字面量(User-defined Literal,UDL),它是 Qt 提供的用于將字符串字面值轉(zhuǎn)換為QString
類型的便捷方法。在這種情況下,字符串字面值是一個 UTF-16 編碼的 Unicode 字符串,最終轉(zhuǎn)換為QString
類型。 -
const QUrl url(QStringLiteral("qrc:///Main.qml"));
在這里,
QStringLiteral
是一個 Qt 宏,用于在編譯時將字符串字面值轉(zhuǎn)換為一個QString
類型的對象。該宏的優(yōu)勢在于避免了在運行時創(chuàng)建QString
對象,從而提高了性能。在這種情況下,字符串字面值是一個普通的字符串,QStringLiteral
將其轉(zhuǎn)換為QString
類型。
在實際使用中,這兩種方法都可以實現(xiàn)相同的功能,即創(chuàng)建一個 QUrl
對象來表示資源文件的 URL。只是它們在編譯時處理字符串字面值的方式略有不同。考慮到性能和簡潔性,推薦使用 QStringLiteral
方法。
qt種qrc查找原理
當(dāng)您使用 qrc:
前綴引用資源文件時,Qt 會自動查找所有已注冊的資源文件。在構(gòu)建過程中,qt_add_resources()
或 qt6_add_resources()
函數(shù)會將資源文件(如 resources.qrc
)編譯成二進制文件,并將它們嵌入到最終的可執(zhí)行文件中。當(dāng)您在運行時使用 qrc:
前綴引用資源文件時,Qt 會在所有已注冊的資源文件中查找匹配的條目。
因此,您不需要在引用資源文件時指定 resources.qrc
,因為 Qt 會自動在所有已注冊的資源文件中查找正確的文件。如果您有多個 .qrc
文件,只要確保它們都通過 qt_add_resources()
或 qt6_add_resources()
函數(shù)正確注冊,Qt 就會在所有已注冊的資源文件中查找。
需要注意的是,在使用多個 .qrc
文件時,請確保文件名和路徑不會發(fā)生沖突,以避免混淆和潛在的錯誤。
使用無前綴的 URL 引用資源文件
根據(jù) Qt 官方文檔,從 Qt 6.2 開始,可以在 QML 代碼中省略前綴,但在 C++ 代碼中,仍然需要使用 qrc:
前綴來引用資源文件。這是因為 QML 和 C++ 是兩種不同的語言,它們有不同的命名規(guī)則和語法結(jié)構(gòu)。
在 QML 中,可以使用 import
語句來引用 QML 文件,而不需要使用前綴。但是,在 C++ 中,必須使用 qrc:
前綴來引用資源文件,以便在 QML 中使用。 文章來源:http://www.zghlxwxcb.cn/news/detail-435833.html
因此,如果您想在 QML 中使用 C++ 代碼,必須在 QML 代碼中使用 qrc:
前綴來引用資源文件。如果您只想在 QML 中使用 C++ 代碼,則可以省略前綴。文章來源地址http://www.zghlxwxcb.cn/news/detail-435833.html
到了這里,關(guān)于C++ cmake工程引入qt6和Quick 教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!