2015-11-08 68 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