如何设置 qml 信号的属性类型



我正在学习qmlquickpyqt5并编写一个小的测试脚本。

在此脚本中,我想在我的 UI 上放置一些内容并打印它的 URL。

测试.qml

import QtQuick 2.3
Rectangle {
    id : root
    signal clicked(int x, int y)
    signal filedroped(list url)
    width: 800
    height: 450
    MouseArea {
        anchors.fill: parent
        onClicked: {
            parent.clicked(mouseX, mouseY)
        }
        DropArea {
            anchors.fill: parent
            onDropped: {
            root.filedroped(drop.urls)
            }
        } 
    }
}

文档说:除了枚举类型之外,任何 QML 基本类型都可以用作自定义属性类型。

但是我在signal filedroped中遇到了这样的错误:

Invalid signal parameter type: list

另外,我已经尝试了urlliststring.
urllist失败了,string有效。

我的脚本有什么问题?

编辑

由于我将 qml 与 pyqt 一起使用,因此我不想使用类型 var .
使用 var,我将在我的 python 脚本中得到一个QJSValue对象而不是基本类型的 python.
为什么 qml 与官方文档的性能不同?文件有误吗?

看来Qt文档中确实存在错误。据说(这里)是

允许的参数类型 [用于信号参数] 与下面列出的参数类型相同 在此页面上定义属性属性。

然而,可以按如下方式定义属性:

property list<Item> items

而这是无效的:

signal mysignal(list<Item> items)

但无论如何,QML列表类型不是解决方案。官方文档非常清楚:

列表只能存储 QML 对象,不能包含任何基本类型 值。(若要在列表中存储基本类型,请使用 var 类型 相反。

换句话说,你不能使用list来存储字符串,url,int。你必须使用var.另一种解决方案是使用带有自定义分隔符而不是 url 列表的格式化字符串,并将其拆分在 Python 端。

看起来urllist是一个url数组,所以在这种情况下你可以使用var

signal filedroped(var urls)

最新更新