QtCreator自定义模块问题

时间:2018-05-02 21:49:09

标签: qt qml qt-creator qt-quick

使用可行的示例编辑

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

问题

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

重新创建问题

制作项目   - 就整个项目的结构而言,这需要一些时间,但所有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.qml中将MainForm {}添加到Window {}中,Window {andEverythingInIt}是从旧main.qml复制的内容以及它所需的导入。如果您运行qmake,构建并点击播放,您应该只看到一个空白窗口,其中包含" Text"在某个地方。

制作模块
现在,在创建者之外的MyApp目录中,添加一个名为Modules的文件夹,并在其中添加一个名为Objects的文件夹。然后在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,您应该可以输入"导入对象1.0"来自MainForm.ui.qml,没有引号。现在,如果你构建并运行它应该像以前一样工作。

最后进入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 {})中的对象。

因此
为什么使用QtQuickUI文件制作模块搞砸了命名方案?有任何想法吗?也许我错误地使用QtQuick,但是当文件被并置时这一切都有效,所以我要说我相信这一切都应该是可能的。

1 个答案:

答案 0 :(得分:1)

我通过从.metainfo文件中删除源字符串来修复此问题。

对于任何关心我的人,我都遵循这些指示: http://doc.qt.io/qtcreator/creator-qml-modules-with-plugins.html 在第5步,当我在Qt文件夹中搜索.metainfo时,我选择了一个随机的metainfo文件,而不是他们专门选择的那个(qtcharts.metainfo vs qtquickcontrols2.metainfo)

qtcharts可能是用于其他类型的模块使用,其中指定源代码执行我不需要的东西,qtquickcontrols2最终得到了我最终想要的语法。最终我找到了这个例子并发现删除了源代码: https://forum.qt.io/topic/56207/how-to-load-custom-qml-controls-into-the-qml-designer