库组件的 Qt.createComponent url



下面是来自TimelinePresenter.qml的函数,这是我创建的自定义组件。

function createMenu() {
var menuComp = Qt.createComponent("Menu.qml");
if( menuComp.status != Component.Ready )
{
if( menuComp.status == Component.Error )
console.debug("Error: " + menuComp.errorString());
return;
}
}

它给出错误:

Error: qrc:/qml/timeline/Menu.qml:-1 No such file or directory

TimelinePresenter.qml 是在 .qrc 文件中指定的资源文件,其路径是 qml/timeline,如错误消息所示,因此 qml 引擎正在尝试在那里找到 Menu.qml。如何指定创建qt菜单组件的路径?

编辑:

我的资源.qrc 文件

<RCC>
<qresource prefix="/">
<file>qml/main_window.qml</file>
<file>qml/timeline/TimelineViewItem.qml</file>
<file>qml/timeline/HorizontalLine.qml</file>
<file>qml/timeline/TimelineView.qml</file>
<file>qml/timeline/VerticalLine.qml</file>
<file>qml/timeline/timeline-item/timeline_item.h</file>
<file>qml/timeline/TimelinePresenter.qml</file>
<file>qml/timeline/timeline-item/analog_timeline_item.h</file>
<file>qml/timeline/timeline-item/digital_timeline_item.h</file>
<file>qml/timeline/timeline_presenter_backend.h</file>
<file>qml/ControllableListPresenter.qml</file>
<file>qml/controllable_list_backend.h</file>
<file>qml/controllable-popup/AddControlUnitPopup.qml</file>
<file>qml/styled/CenteredPopup.qml</file>
<file>qml/styled/StyledTextField.qml</file>
</qresource>
</RCC>

您将组件的创建与属于组件的对象的创建混淆了。

Menu 组件已经存在并由 Qt 提供,您必须做的是使用Qt.createQmlObject()方法创建对象。

例:

var menuObj = Qt.createQmlObject('import QtQuick.Controls 2.0 ; Menu {
MenuItem { text: "Cut" }
MenuItem { text: "Copy" }
MenuItem { text: "Paste" } }', parentItem, "dynamicSnippet1");

完整示例:

import QtQuick 2.7
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
id: parentItem
Component.onCompleted: {
var menu = Qt.createQmlObject('import QtQuick.Controls 2.0 ; Menu {
MenuItem { text: "Cut" }
MenuItem { text: "Copy" }
MenuItem { text: "Paste" }
}', parentItem,"dynamicSnippet1");
// test: open menu
menu.open()
}
}

如果您在评论中描述的情况下,我建议只创建一个Menu,并且仅在您单击的位置popup()它,将其设置为特定上下文。

我准备了一个小例子来说明如何使用Menu

import QtQuick 2.7
import QtQuick.Window 2.0
import QtQuick.Controls 2.3 // Necessary for the "Action" I used. Create the Menu otherwise if you are bound to older versions.
import QtQml 2.0
ApplicationWindow {
id: window
visible: true
width: 600
height: 600
Repeater {
model: ListModel {
ListElement { color: 'black'; x: 400; y: 50  }
ListElement { color: 'black'; x: 100; y: 190 }
ListElement { color: 'black'; x: 70;  y: 80 }
ListElement { color: 'black'; x: 30;  y: 0 }
ListElement { color: 'black'; x: 340; y: 500 }
ListElement { color: 'black'; x: 210; y: 10 }
}
delegate: MouseArea {
x: model.x
y: model.y
width: 50
height: 50
property QtObject modelItem: model
onClicked: menu.openMenu(x + mouse.x, y + mouse.y, modelItem)
Rectangle {
color: model.color
anchors.fill: parent
}
}
}
Menu {
id: menu
Action { text: "green"    ; onTriggered: { menu.currentContext.color = text } }
Action { text: "blue"     ; onTriggered: { menu.currentContext.color = text } }
Action { text: "pink"     ; onTriggered: { menu.currentContext.color = text } }
Action { text: "yellow"   ; onTriggered: { menu.currentContext.color = text } }
Action { text: "orchid"   ; onTriggered: { menu.currentContext.color = text } }
Action { text: "orange"   ; onTriggered: { menu.currentContext.color = text } }
Action { text: "teal"     ; onTriggered: { menu.currentContext.color = text } }
Action { text: "steelblue"; onTriggered: { menu.currentContext.color = text } }
property QtObject currentContext
function openMenu(x, y, context) {
currentContext = context
popup(x, y)
}
}
}

虽然我认为这个答案可能会解决你的问题,但我知道它并不是你最初所说的问题的答案。


对于组件部分:我想你误解了什么是Component- 它不是Item.它是创建QtObjects前提阶段,更像是原型或配置工厂

因此,您的函数 - 如果它可以工作 - 将以创建一个不可见的东西而告终,您可以通过调用createObject()中创建对象。

创建Components是正确的做法,如果你想在以后创建一个对象,并且你可能想多次创建类似的对象,无论是通过JavaScript还是其他QML类型,这些QML类型期望Components作为一些输入(例如委托(。

要创建组件,您有多种可能性,例如:

  1. Qt.createComponent(url)
  2. Component { SomeItem {} }

第一个期望您知道网址,但在您的情况下,您不知道。为了规避这种情况,最简单的解决方案是创建一个新文件,例如仅包含Menu {}MyMenu.qml- 然后您可以从中创建Component

第二个不要求您知道 URL,但它不是动态创建的。

Component {
id: myCmp
Menu {
}
}
onSomeSignal: myCmp.createObject({ prop1: val1 }, this)

在这里,当文件中的对象实例化时,会自动创建Component。这使得(一次(最初有点慢,因为必须处理更多的代码,但你以后不必这样做。

如果顶级元素是Component,则创建具有Qt.createQmlObject("Write a new QML-File here")eyllanescshow 之类的对象也可用于创建Component。如果您没有作为顶级Component,它还将首先创建一个组件,该组件曾经用于创建QtObject,然后被丢弃。这是动态创建对象的最慢但最灵活的方法。

相关内容

  • 没有找到相关文章

最新更新