отредактировано с работоспособным примером
Использование Qt 5.10.0, QtCreator 4.5.0, Qt5.10.0 MSVC2015 32-битный компилятор в Windows7 64-битная
Проблема
После создания пользовательского модуля (все файлы, автоматически созданные из File-> New File или Project ...-> Qt-> QtQuick UI File) и попытки перетаскивания связанных файлов qml из-за пределов библиотеки (в некоторую MainForm). ui.qml в другом каталоге) имя объекта, помещаемого в MainForm, является неправильным, и указанный объект не может быть создан в MainForm. Все это работало нормально, когда не было модуля, и все основные и объектные файлы qml / ui.qml были размещены вместе.
Воссоздание вопроса
Создание проекта
- Что касается структуры всего проекта, это займет некоторое время, но все файлы qml могут быть более или менее теми, которые были созданы автоматически, и проблема сохраняется.
В QtCreator выберите Файл-> Новый файл или проект ...-> Приложение-> Qt Quick Application. Я назвал его MyApp, сделанный с помощью qmake, минимальная версия Qt 5.9, компилятор Qt5.10.0 MSCV2015 32bit
С этого момента, когда я говорю добавить новый файл QtQuickUI, я имею в виду Файл-> Новый файл или проект ...-> Qt-> Файл QtQuick UI
Скопируйте содержимое main.qml. Используя панель QtCreator Projects, добавьте новый файл QtQuickUI в папку, где находится main.qml (в папке ресурсов для проекта) с именем Main. Он скажет вам, что main.qml уже существует, просто переопределите его. Это создаст Main.qml и Main.ui.qml для использования дизайнером. Вам также скорее всего придется удалить старый файл main.qml из файла qml.qrc. Вставьте содержимое main.qml из ранее в Main.qml.
Теперь в том же каталоге создайте новый файл QtQuickUI с именем MyObject таким же образом. Если затем вы откроете файл MainForm.ui.qml на вкладке «Дизайнер» и перейдете в редактор форм, вы можете перетащить MyObject на MainForm из библиотеки дизайнеров. Затем, переключившись на текстовый редактор, вы увидите, что MainForm.ui.qml содержит MyObject {} с различными свойствами. Обратите внимание, что в настоящее время содержимое MyObject.qml фактически является «MyObjectForm {}». Именно здесь возникает проблема при преобразовании в модуль.
В файле MyObjectForm.ui.qml я также бросил текстовое поле только для целей тестирования.
В main.cpp измените путь main.qml, который ищет движок, на «qrc: /Main.qml» вместо main в нижнем регистре. Затем в Main.qml добавьте MainForm {} в Window {}, Window {andEverythingInIt} - это то, что было скопировано из старого main.qml вместе с импортом, необходимым для него. Если вы запустите qmake, соберите и нажмете кнопку play, вы должны увидеть просто пустое окно с текстом в некотором месте.
Изготовление модуля
Теперь, вне создателя, в каталоге MyApp добавьте папку с именем Модули и в нее папку с именем Объекты. Затем в Creator щелкните правой кнопкой мыши файл qml.qrc, добавьте существующий каталог и добавьте папку Modules. Затем, вне создателя, переместите MyObject.qml и MyObjectForm.ui.qml в папку Objects. Щелкните правой кнопкой мыши qml.qrc в создателе, откройте в редакторе и переименуйте два файла, которые вы только что переместили, добавив модули / объекты / вперед. Затем в файле MyApp.pro добавьте «Модули» с кавычками в переменную QML_IMPORT_PATH. Также в main.cpp перед загрузкой файла Main.qml добавьте engine.addImportPath ("../ MyApp / Modules") ;. Мне пришлось жестко закодировать путь, потому что я еще ничего не получил для работы. Я надеялся, что "qrc: / Modules" сработает, но это не сработало. Если вы автоматически сгенерировали проект с помощью конструктора, папка сборки / рабочий каталог по умолчанию будет находиться в том же каталоге, что и MyApp, поэтому этот путь должен работать.
Теперь извне создатель перейдите в папку Modules / Objects и добавьте новый файл (без расширения) с именем qmldir. Откройте его в блокноте или что-то еще и добавьте следующее:
module Modules.Objects
MyObject 1.0 MyObject.qml
Перезапустите qmake, и вы сможете набрать «import Objects 1.0» из MainForm.ui.qml без кавычек. Теперь, если вы соберете и запустите, все должно работать как прежде.
Наконец, перейдите в папку Objects и добавьте папку с именем designer. В папке конструктора добавьте новый файл с именем myobject.metainfo. Я не думаю, что имя имеет значение, только часть .metainfo. В нем поместите следующее:
MetaInfo {
Type {
name: "Objects.MyObject"
icon: ""
ItemLibraryEntry {
name: "MyObject"
category: "Objects"
libraryIcon: ""
version: "1.0"
requiredImport: "Objects"
QmlSource { source: "../MyObject.qml" }
}
}
}
Теперь, если вы откроете файл MainForm.ui.qml в конструкторе, вы можете перетащить MyObject из панели библиотеки! Если вы сделаете это и загляните в MainForm.ui.qml с помощью текстового редактора, то, что вы на самом деле увидите, было создано MyObjectForm {}, и до тех пор, пока вы не переименуете его вручную, чтобы удалить «Form» из имени, код не будет скомпилирован и успешно запущен ; даже если ранее размещенное перетаскивание позволило определить, что объект должен быть назван в честь MyObject.qml (MyObject {}), а не того, что было в MyObject.qml (MyObjectForm {}).
So
Почему создание модуля с использованием файлов QtQuickUI портит схему именования? Есть идеи? Возможно, я неправильно использую QtQuick, но все это работало, когда файлы были размещены вместе, поэтому я хочу сказать, что считаю, что все это возможно.