2015-11-08 112 views
1

我想用cmake編譯qml應用程序。 這裏是我的cmake文件:使用cmake複製所有qt資源

cmake_minimum_required(VERSION 3.3) 
project(QMLTest) 
set(CMAKE_AUTOMOC ON) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
set(SOURCE_FILES main.cpp) 

find_package(Qt5Widgets REQUIRED) 
find_package(Qt5Quick REQUIRED) 

add_executable(QMLTest main.cpp) 
include_directories(${Qt5Widgets_INCLUDES}) 
add_definitions(${Qt5Widgets_DEFINITIONS}) 
qt5_use_modules(QMLTest Widgets Quick) 

而且main.cpp中:

#include <QGuiApplication> 
#include <QQuickView> 

int main(int argc, char** argv) 
{ 
    QGuiApplication app(argc, argv); 
    QQuickView view; 
    view.resize(800, 480); 
    view.setResizeMode(QQuickView::SizeRootObjectToView); 
    view.setSource(QUrl::fromLocalFile("gui/MainWidnow.qml")); 
    view.show(); 
    return app.exec(); 
} 

當我嘗試編譯它,我得到一個錯誤:

gui/MainWidnow.qml: File not found.

我如何可以複製我所有的qt資源進入應用程序目錄?

回答

2

不是將你的QML文件複製到應用程序目錄中,而是推薦使用Qt的資源系統(1),它允許你直接在可執行文件中嵌入QML文件等資源。要做到這一點,你需要首先創建一個資源文件,如resources.qrc註冊您的應用程序資源:

<!DOCTYPE RCC> 
<RCC version="1.0"> 
    <qresource> 
     <file>gui/MainWindow.qml</file> 
    </qresource> 
</RCC> 

然後,您的資源文件添加到您的CMake的配置。一旦做到這一點

qt5_add_resources(RCC_SOURCES resources.qrc) 
add_executable(QMLTest ${RCC_SOURCES} main.cpp) 

,您可以使用文件URL格式:/gui/MainWindow.qml引用這個資源,這就是:這將創建一個從資源文件中的源文件,你需要在你的應用程序源代碼,包括現在嵌入您的應用程序二進制文件QT會自動解決這個問題爲您:

view.setSource(QUrl(":/gui/MainWindow.qml")); 

有上部署QML應用程序(2)Qt文檔中的一些細節。

+0

最後一行對我不起作用,因爲QUrl會查找路徑,如''path /:/gui/file.qml'''。將其更改爲'view.setSource(QUrl(「qrc:/gui/MainWindow.qml」));'做了竅門 – DuKes0mE

+0

@ DuKes0mE這很令人驚訝,因爲根據[Qt文檔](http://doc.qt .io/qt-5/resources.html)和我的經驗是一樣的。 – ajshort

+1

您是否嘗試過的Qt5QuickCompiler:http://doc.qt.io/QtQuickCompiler/qquickcompiler-building-with-cmake.html 一般你可以替換qtquick_compiler_add_resources(qt5_add_resources()看起來像),但我不知道如果AUTORCC足夠聰明,可以自行處理。 – Atifm

0

有多種方式做到這一點,例如:

add_custom_target(copy-runtime ALL 
    COMMAND cmake -E copy ${CMAKE_SOURCE_DIR}/gui/MainWindow.qml 
     ${CMAKE_BINARY_DIR} 
    DEPENDS QMLTest) 

我沒有測試,但你會得到的想法。另一種選擇是例如使用CMake的安裝命令通過「make install」在本地安裝運行時文件。然而,在這種情況下,最好的選擇是使用Qt的資源系統,比如ajshort在他的答案中推薦的,並將所需的文件嵌入到可執行文件中。

+0

我更喜歡通過複製的symolic鏈接。您可能會編輯錯誤的文件或忘記重新複製。 – usr1234567