Проблема с пользовательским модулем QtCreator - PullRequest
0 голосов
/ 03 мая 2018

отредактировано с работоспособным примером

Использование 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, но все это работало, когда файлы были размещены вместе, поэтому я хочу сказать, что считаю, что все это возможно.

1 Ответ

0 голосов
/ 04 мая 2018

Я исправил проблему, удалив исходную строку из файлов .metainfo.

Для всех, кого это волнует, я следовал этим инструкциям: http://doc.qt.io/qtcreator/creator-qml-modules-with-plugins.html и на шаге 5 я выбрал случайный файл metainfo, когда искал в папке Qt файл .metainfo, а не тот, который они специально выбрали (qtcharts.metainfo против qtquickcontrols2.metainfo)

qtcharts, вероятно, был для какого-то другого типа использования модуля, где указание источника делает то, что мне не нужно, qtquickcontrols2 в итоге получил синтаксис, который я действительно хотел в конце. В конце концов я нашел этот пример и обнаружил, что удаление исходного кода работает: https://forum.qt.io/topic/56207/how-to-load-custom-qml-controls-into-the-qml-designer

...