首页 文章

QtCreator定制模块问题

提问于
浏览
-1

用可行的例子编辑

在Windows7 64bit上使用Qt 5.10.0,QtCreator 4.5.0,Qt5.10.0 MSVC2015 32位编译器

The Problem

创建自定义模块(从File-> New File或Project ...-> Qt-> QtQuick UI File自动生成的所有文件)并尝试从库外拖放相关的qml文件(进入一些MainForm.ui.qml)在另一个目录中)放置在MainForm中的对象的名称不正确,并且所述对象无法在MainForm中实例化 . 当没有模块并且所有主要和对象qml / ui.qml文件被并置时,这一切都正常 .

Recreating the issue

Making the project - 就整个项目的结构而言,这需要一些时间,但所有qml文件都可以或多或少地是自动生成的任何内容,并且问题仍然存在 .

在QtCreator中,单击文件 - >新建文件或项目...->应用程序 - > Qt快速应用程序 . 我把它命名为MyApp,用qmake制作,最小版本Qt 5.9,编译器Qt5.10.0 MSCV2015 32bit

从现在开始,我说添加一个新的QtQuickUI文件,我的意思是文件 - >新文件或项目...-> Qt-> QtQuick UI文件

复制main.qml的内容 . 使用QtCreator Projects窗格将新的QtQuickUI文件添加到main.qml所在的文件夹(位于项目的resources文件夹下),名为Main . 它会告诉你main.qml已经存在,只需覆盖它 . 这将生成一个Main.qml和Main.ui.qml供设计人员使用 . 您将不得不从qml.qrc文件中删除旧的main.qml . 将之前main.qml的内容粘贴到Main.qml中 .

现在在同一目录中以相同的方式创建一个名为MyObject的新QtQuickUI文件 . 如果然后在Designer选项卡中打开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 是从旧main.qml复制的内容以及它所需的导入 . 如果你运行qmake,build和hit play,你应该只看到一个空白的窗口,在某个地方有“Text” .

Making the module
现在,在创建者之外的MyApp目录中,添加一个名为Modules的文件夹,并在其中添加一个名为Objects的文件夹 . 然后在Creator中,右键单击qml.qrc文件,添加现有目录,然后添加Modules文件夹 . 然后,在创建者外部,将MyObject.qml和MyObjectForm.ui.qml移动到Objects文件夹 . 右键单击创建者中的qml.qrc,在编辑器中打开,然后重命名刚移动的两个文件,将模块/对象/附加到前面 . 然后在MyApp.pro文件中添加带有引号的"Modules"到QML_IMPORT_PATH变量 . 另外在main.cpp中,在加载Main.qml文件之前添加engine.addImportPath("../MyApp/Modules");.我不得不对路径进行硬编码,因为我没有't gotten anything else to work yet. I was hoping 967664 would work but it didn' t . 如果您使用设计器自动生成项目,则构建文件夹/工作目录将默认与MyApp位于同一目录中,因此此路径应该可用 .

现在,从创建者外部进入Modules / Objects文件夹并添加一个名为qmldir的新文件(没有扩展名) . 在记事本或其他东西中打开它并添加以下内容:

module Modules.Objects
MyObject 1.0 MyObject.qml

重新运行qmake,您应该可以在MainForm.ui.qml中键入“import Objects 1.0”,不带引号 . 现在如果你构建并运行它应该像以前一样工作 .

最后进入Objects文件夹并添加名为designer的文件夹 . 在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 回答

相关问题