无法获取 QList 的长度,尽管文档告诉我可以

问题描述 投票:0回答:1

我正在为 QGIS 3.12+ 开发一个小插件,无论我尝试什么,我都无法执行检索 QListWidget.selectedItems() 返回的 QList 中的项目数的简单任务

我不太精通Python,但已通读docs并尝试了以下每一项,但都失败了。

我错过了什么?

#Returns items as i can loop though them with: for item in selected:
selected = self.dlg.qListWidgetLayers.selectedItems()

#TypeError: count() takes exactly one argument (0 given)
#Docs claim there's a count that doesn't need the parameter...
intTotal = selected.count()

#AttributeError: 'list' object has no attribute 'size'
intTotal = selected.size()

#AttributeError: 'list' object has no attribute 'length'
intTotal = selected.length()

#AttributeError: 'list' object has no attribute 'len'
intTotal = selected.len() #<- This attempt is incorrect, should actually be len(selected)

python qgis qlistwidget qlist
1个回答
0
投票

只是想对这个问题表示感谢 - 我遇到了同样类型的问题,所以我想记录下来,因为它比原来的问题更难以追踪;如果没有这个问题和评论,我将很难找到答案。

总的来说,我想说的答案是,正如 @Jongware 在评论中暗示的那样,C++ API 中的

QList
自动转换为 Python API 中的普通
list
- 问题是这并不明确文档中有说明。

这是我的特殊问题:从类似 QComboBox 的小部件中,我尝试通过以下方式检查其

selectionChanged
弹出模型的
QCompleter
事件:

completer.popup().selectionModel().selectionChanged.connect(self.on_selection_changed)
# ...

def on_selection_changed(self, selected, deselected):
    print(f"on_selection_changed {selected=}")

https://doc.qt.io/qt-5/qitemselectionmodel.html#selectionChanged 中,对于 C++ API,请注意签名是

void QItemSelectionModel::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
;事实上,在打印输出中我得到了

on_selection_changed selected=<PyQt5.QtCore.QItemSelection object at 0x000001acc52dbdf0> 

到目前为止,一切都很好。现在,在 https://doc.qt.io/qtforpython-5/PySide2/QtCore/QItemSelection.html 中,对于 Python API 进行了说明

[...] QItemSelection 基本上是选择范围的列表,请参阅 QItemSelectionRange [...]

...逐字取自 C++ 文档,网址为 https://doc.qt.io/qt-5/qitemselection.html(不过还额外注明了“继承:QList”)

此外,Python 文档指出有一些方法:

但是,当我尝试打印

{selected.length()=}
时,我得到:

AttributeError: 'QItemSelection' object has no attribute 'length'

...这比“‘list’对象没有属性‘length’”更糟糕,因为它甚至不意味着任何到普通 Python

list
对象的转换,而是暗示原始对象C++对象没有这样的方法,这显然与文档相冲突。

但是,一旦我得到提示,C++ API 中的

QList
会自动转换为 Python API 中的
list
,我现在可以确认,对我来说,在 Python 中,
len(selected)
可以工作,而不是
selected.length()
;和
selected[0]
代替了
selected.at(0)

我的猜测是PyQt5文档是从C++文档自动生成的,但不知何故没有考虑到

QList
list
的自动转换,因此自动将C++方法包含在PyQt5文档中,即使它们真的不属于那里。

© www.soinside.com 2019 - 2024. All rights reserved.