import QtQuick.Controls 2.0 не работает - QQmlApplicationEngine не удалось загрузить компонент

У меня есть приложение, созданное в его проекте с использованием CMake в Qt5.7, поэтому, когда import QtQuick.Controls 2.0 приложение не загрузилось со следующей ошибкой:

плагин не может быть загружен для модуля «QtQuick.Controls»: не удается загрузить библиотеку C: \ Qt \ Qt5.7.0 \ 5.7 \ msvc2015 \ qml \ QtQuick \ Controls.2 \ qtquickcontrols2plugind.dll: указанный модуль не может быть найден.

CMakeLists.txt

set(CMAKE_PREFIX_PATH "C:\\Qt\\Qt5.7.0\\5.7\\msvc2015")
set(CMAKE_AUTOMOC ON) 
set(CMAKE_AUTORCC ON) 
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Core REQUIRED)
find_package(Qt5Qml) 
find_package(Qt5Quick) 
find_package(Qt5QuickControls2)

...

add_executable(MyApp ${SRC} ${HEADER} ${RESOURCES})

target_link_libraries(MyApp
Qt5::WinMain    
Qt5::Core   
Qt5::Qml    
Qt5::Quick  
Qt5::QuickControls2     
)

Файл DLL, загруженный в вывод Visual Studio:

'MyApp.exe' (Win32): Loaded 'C:\Qt\Qt5.7.0\5.7\msvc2015\qml\QtQuick.2\qtquick2plugind.dll'. Symbols loaded.
'MyApp.exe' (Win32): Loaded 'C:\Qt\Qt5.7.0\5.7\msvc2015\qml\QtQuick\Controls.2\qtquickcontrols2plugind.dll'. Symbols loaded.
'MyApp.exe' (Win32): Unloaded 'C:\Qt\Qt5.7.0\5.7\msvc2015\qml\QtQuick\Controls.2\qtquickcontrols2plugind.dll'

person Reza Ebrahimi    schedule 25.06.2016    source источник
comment
Какие файлы есть в C:\Qt\Qt5.7.0\5.7\msvc2015\qml\QtQuick\Controls.2? Похоже, он пытается найти отладочную версию плагина, но есть ли она в вашей установке Qt?   -  person jpnurmi    schedule 25.06.2016
comment
Да, если файл dll находится на пути и загружен в Visual Studio (я вижу в intellisense, его символы загружены), но не удается загрузить приложение.   -  person Reza Ebrahimi    schedule 25.06.2016
comment
Почему-то сразу выгружает плагин? Я не знаю, что могло быть причиной этого. Что произойдет, если вы откроете плагин с помощью Dependency Walker? Это предварительно созданная установка Qt из установщика? Если да, то работает ли пример Qt Quick Controls 2 Gallery?   -  person jpnurmi    schedule 25.06.2016
comment
он выгружается из-за того, что QQmlApplicationEngine не удалось загрузить компонент, поэтому я буду использовать DependencyWalker, поэтому пример Gallery хорошо работает при сборке и запуске из QtCreator.   -  person Reza Ebrahimi    schedule 25.06.2016


Ответы (3)


Я нашел решение. Проблема в том, что QtQuick.Controls 2.0 зависит от модуля QtQuick.Templates 2.0, поэтому я скопировал его dll в выходной каталог, и он успешно работает.

необходимые библиотеки DLL (для отладочной версии):

Qt5QuickTemplates2d.dll
Qt5QuickControls2d.dll

необходимые библиотеки DLL (для версии Release):

Qt5QuickTemplates2.dll
Qt5QuickControls2.dll
person Reza Ebrahimi    schedule 25.06.2016
comment
Это то, что интеграция Qt CMake может / должна обрабатывать автоматически? Это нормально, что вам приходится вручную перечислять всю цепочку зависимостей? Или это, возможно, отсутствие объявления зависимости где-то в QQC2? - person jpnurmi; 25.06.2016
comment
На самом деле, я только что заметил, что QtGui и QtXmlPatterns также не указаны явно, поэтому он должен до некоторой степени разрешать зависимости. - person jpnurmi; 25.06.2016

В Windows Qt предоставляет инструмент развертывания, который автоматически сканирует все зависимости Qt и QML:

%QTDIR%\bin\windeployqt.exe your_app.exe --qmldir your\qml\files

См. документацию Qt:

Инструмент можно найти в QTDIR / bin / windeployqt. Он принимает файл .exe или каталог, содержащий файл .exe в качестве аргумента, и сканирует исполняемый файл на наличие зависимостей. Если каталог передается с аргументом --qmldir, windeployqt использует инструмент qmlimportscanner для сканирования файлов QML внутри каталога на предмет зависимостей импорта QML. Затем выявленные зависимости копируются в каталог исполняемого файла. Кроме того, жестко заданные локальные пути в Qt5Core.dll заменены на относительные.

person tommyk    schedule 21.06.2017

Если вы используете Ubunty, попробуйте установить qml-module-qtquick-controls2

sudo apt install qml-module-qtquick-controls2
person Andrey Semenov    schedule 08.06.2020