我正在为 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)
只是想对这个问题表示感谢 - 我遇到了同样类型的问题,所以我想记录下来,因为它比原来的问题更难以追踪;如果没有这个问题和评论,我将很难找到答案。
总的来说,我想说的答案是,正如 @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 文档指出有一些方法:
def length ()
https://doc.qt.io/qtforpython-5/PySide2/QtCore/QItemSelection.html#PySide2.QtCore.PySide2.QtCore.QItemSelection.lengthdef at (i)
https://doc.qt.io/qtforpython-5/PySide2/QtCore/QItemSelection.html#PySide2.QtCore.PySide2.QtCore.QItemSelection.at但是,当我尝试打印
{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文档中,即使它们真的不属于那里。