Qt6使用cmake
1.使用pro2cmake
https://blog.csdn.net/haokan123456789/article/details/148676526
https://www.qt.io/blog/introducing-qmake2cmake
2.一些对应关系
https://stackoverflow.com/questions/43763416/how-to-convert-qmake-to-cmake
https://wiki.qt.io/CMake_Port/Porting_Guide
3.示例
https://blog.csdn.net/weixin_43359674/article/details/127040308#:~:text=%E6%9C%AC%E6%96%87%E4%BB%8B%E7%BB%8D%E5%A6%82%E4%BD%95%E5%9C%A8Qt6%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8CMake%E9%80%9A%E8%BF%87%E5%AD%90%E7%9B%AE%E5%BD%95%E7%AE%A1%E7%90%86%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E5%92%8C%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%8C%E4%BB%A5%E4%BE%BF%E4%BA%8E%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%E7%9A%84%E7%BB%84%E7%BB%87%E5%92%8C%E7%BB%B4%E6%8A%A4%E3%80%82%20%E6%96%87%E7%AB%A0%E8%AF%A6%E7%BB%86%E5%B1%95%E7%A4%BA%E4%BA%86%E5%88%9B%E5%BB%BA%E5%AD%90%E7%9B%AE%E5%BD%95%E3%80%81%E9%85%8D%E7%BD%AECMakeLists.txt%E6%96%87%E4%BB%B6%E4%BB%A5%E5%8F%8A%E9%93%BE%E6%8E%A5%E5%BA%93%E7%9A%84%E5%85%B7%E4%BD%93%E6%AD%A5%E9%AA%A4%E3%80%82%20%E6%91%98%E8%A6%81%E7%94%9F%E6%88%90%E4%BA%8E%20C%E7%9F%A5%E9%81%93%20%EF%BC%8C%E7%94%B1,DeepSeek-R1%20%E6%BB%A1%E8%A1%80%E7%89%88%E6%94%AF%E6%8C%81%EF%BC%8C%20%E5%89%8D%E5%BE%80%E4%BD%93%E9%AA%8C%20%3E%20%E4%B8%BA%E4%BA%86%E4%BE%BF%E4%BA%8E%E7%AE%A1%E7%90%86%E5%A4%9A%E6%96%87%E4%BB%B6%E7%9A%84%E9%A1%B9%E7%9B%AE%EF%BC%8C%E9%9C%80%E8%A6%81%E5%88%86%E6%88%90%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E6%9D%A5%E5%AD%98%E6%94%BE%E4%B8%8D%E5%90%8C%E5%8A%9F%E8%83%BD%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%8F%AF%E4%BB%A5%E6%96%B9%E4%BE%BF%E7%AE%A1%E7%90%86%EF%BC%8C%E4%B8%8D%E4%BC%9A%E5%AF%BC%E8%87%B4%E9%A1%B9%E7%9B%AE%E5%A4%A7%E4%BA%86%E4%BB%A5%E5%90%8E%E7%9A%84%E6%B7%B7%E4%B9%B1%E3%80%82
4.测试例子
①文件目录
qml:
后台工程:
工程目录
②main工程
cmakelist:
cmake_minimum_required(VERSION 3.16) project(Testusefuentui VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Core Quick) qt_standard_project_setup(REQUIRES 6.8) add_subdirectory(Moduls/NewWidget) add_subdirectory(Moduls/Math) qt_add_executable(${PROJECT_NAME} main.cpp ) # 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. set_target_properties(${PROJECT_NAME} PROPERTIES # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appTestusefuentui 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 ${PROJECT_NAME} BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Quick NewWidget Math )
main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> #include "Mytool.h" #include "Mymath.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; Mytool mytool(&engine); mytool.print(); Mymath mymath; mymath.cal(); return app.exec(); }
③qml工程
cmakelist:
cmake_minimum_required(VERSION 3.16) project(NewWidget 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) # 查找Qt6的模块 find_package(Qt6 REQUIRED COMPONENTS Core Quick Gui Qml) # 头文件 set(HEADERS Mytool.h Test.h ) # 源文件 set(SOURCES Mytool.cpp Test.cpp ) # QML 资源文件 set(RESOURCES qml.qrc ) # 编译成静态库并添加源文件到静态库中, 确保add_library() 或 add_executable()在 target_link_libraries() 之前调用 add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS} ${RESOURCES} ) # 链接Qt6库 target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Qml ) # 设置包含目录,让库的使用者能找到头文件 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
入口类
#ifndef MYTOOL_H #define MYTOOL_H #include <QObject> #include <QGuiApplication> #include <QQmlApplicationEngine> class Mytool : public QObject { Q_OBJECT public: explicit Mytool(QQmlApplicationEngine *engine, QObject *parent = nullptr); void print(); signals: private: QQmlApplicationEngine *m_engine = nullptr; }; #endif // MYTOOL_H #include "Mytool.h" #include "QDebug" Mytool::Mytool(QQmlApplicationEngine *engine, QObject *parent) : QObject{parent} { m_engine = engine; } void Mytool::print() { qDebug()<<"##################################"; Q_INIT_RESOURCE(qml); const QUrl url(QStringLiteral("qrc:/qml/QML/MyToolComponent.qml")); #if 0 QString filePath = "D:/work/QtSpace/Testusefuentui/Moduls/NewWidget/QML/MyToolComponent.qml"; const QUrl url = QUrl::fromLocalFile(filePath); #endif QObject::connect(m_engine, &QQmlApplicationEngine::objectCreated, qApp, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); m_engine->load(url); }
qml文件
import QtQuick import FluentUI 1.0 Window { width: 640 height: 480 visible: true title: qsTr("Hello World") FluRectangle { color: "red" width: 30 height: 30 anchors.centerIn: parent } }
④后台工程
cmakelist:
cmake_minimum_required(VERSION 3.16) project(Math 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) # 查找Qt6的模块 find_package(Qt6 REQUIRED COMPONENTS Core Quick Gui Qml) # 头文件 set(HEADERS Mymath.h ) # 源文件 set(SOURCES Mymath.cpp ) # QML 资源文件 set(RESOURCES ) # 编译成静态库并添加源文件到静态库中, 确保add_library() 或 add_executable()在 target_link_libraries() 之前调用 add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS} ${RESOURCES} ) # 链接Qt6库 target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Qml ) # 设置包含目录,让库的使用者能找到头文件 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
调用类
#ifndef MYMATH_H #define MYMATH_H class Mymath { public: Mymath(); void cal(); }; #endif // MYMATH_H #include "Mymath.h" #include <QDebug> Mymath::Mymath() {} void Mymath::cal() { qDebug()<<"cal"; }
说明:
1.qt6+cmake的这种子项目工程与qt5+pri的不一样,前者是所有子项目都是静态或动态库,后者是将所有源码都编译到exe中
2.此方式在qml工程里加载了qml资源文件,需要在C++里将资源文件写入静态库,使用:Q_INIT_RESOURCE(qml)实现,qml就是资源名称;也可在cmakelist中实现,但是目前还没成功
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html