Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QtCreator自定义模块问题_Qt_Qml_Qt Creator_Qt Quick - Fatal编程技术网

QtCreator自定义模块问题

QtCreator自定义模块问题,qt,qml,qt-creator,qt-quick,Qt,Qml,Qt Creator,Qt Quick,用可行的例子编辑 在Windows7 64位上使用Qt 5.10.0、QtCreator 4.5.0、Qt5.10.0 MSVC2015 32位编译器 问题 创建自定义模块(从文件->新建文件或项目自动生成的所有文件…->Qt->QtQuick UI文件)并尝试从库外部拖放关联的qml文件(到另一个目录中的某个MainForm.UI.qml中)后放置在MainForm中的对象的名称不正确,并且无法在MainForm中实例化所述对象。当没有模块并且所有的主和对象qml/ui.qml文件都被并置时,

用可行的例子编辑

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

问题

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

重新创建问题

制作项目 -就整个项目的结构而言,这需要一些时间,但所有qml文件或多或少都是自动生成的,并且问题仍然存在

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

从现在开始,当我说添加一个新的QtQuickUI文件时,我指的是文件->新文件或项目…->Qt->QtQuickUI文件

复制main.qml的内容。使用“QtCreator项目”窗格,将新的QtQuickUI文件添加到main.qml所在的名为main的文件夹(在项目的“资源”文件夹下)。它会告诉您main.qml已经存在,只需覆盖它。这将生成一个Main.qml和Main.ui.qml供设计器使用。您很可能还必须从qml.qrc文件中删除旧的main.qml。将先前的main.qml内容粘贴到main.qml中

现在,在相同的目录中,以相同的方式创建一个名为MyObject的新QtQuickUI文件。如果随后在Designer选项卡中打开MainForm.ui.qml,并转到form editor,则可以将MyObject从Designer库拖放到MainForm上。然后切换到文本编辑器,可以看到MainForm.ui.qml包含一个具有各种属性的MyObject{}。请注意,目前MyObject.qml中包含的内容实际上是“MyObjectForm{}”。这就是转换为模块时出现问题的地方

在MyObjectForm.ui.qml文件中,我还抛出了一个文本框,仅用于测试目的

在main.cpp中,将引擎查找的main.qml路径更改为“qrc:/main.qml”,而不是小写的main。然后在Main.qml中,将MainForm{}添加到窗口{}中,窗口{andeverythingit}是从旧Main.qml复制的内容以及它所需的导入。如果您运行qmake、build并点击play,您应该会在某个位置看到一个空白窗口,其中有“Text”

制作模块
现在,在creator之外,在MyApp目录中添加一个名为Modules的文件夹,并在其中添加一个名为Objects的文件夹。然后在Creator中,右键单击qml.qrc文件,添加现有目录,并添加Modules文件夹。然后,在创建者外部,将MyObject.qml和MyObjectForm.ui.qml移动到Objects文件夹。右键单击creator中的qml.qrc,在编辑器中打开,并重命名刚才移动的两个文件,将模块/对象/附加到前面。然后在MyApp.pro文件中,将带有引号的“Modules”添加到QML\u IMPORT\u PATH变量中。同样在main.cpp中,在加载main.qml文件之前,添加engine.addImportPath(“../MyApp/Modules”);。我不得不硬编码路径,因为我还没有得到任何其他工作。我希望“qrc:/Modules”能起作用,但它没有起作用。如果使用设计器自动生成项目,则默认情况下,生成文件夹/工作目录将与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{})中的名称命名

所以

为什么使用QtQuickUI文件制作模块会破坏命名方案?有什么想法吗?也许我没有正确使用QtQuick,但是当文件被并置时,这一切都起了作用,所以我想说我相信这一切都是可能的。

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

对于任何关心此事的人,我都遵循以下指示: 在第5步,当我搜索Qt文件夹中的.metainfo时,我选择了一个随机的metainfo文件,而不是他们特别选择的文件(qtcharts.metainfo vs qtquickcontrols2.metainfo)

qtcharts 1可能用于其他类型的模块,其中指定源代码做了我不需要的事情,qtquickcontrols2最终得到了我真正想要的语法。最终我找到了这个例子,发现删除源代码是有效的:

请阅读有用的文章。现在你的帖子没有给你任何帮助的机会。没有办法运行和测试代码。谢谢,我会尝试用一个可行的例子来编辑这个问题,但它会相当复杂。我希望有人能使用File->New->QtQuickUI文件创建一个自定义模块,然后说是的,这是可能的,或者说不是,这还不足以拖拽qml's