我使用Python 3和PySide2(适用于Python的Qt)(均为最新版本)。我有一个PySide2对象的列表,必须检查列表中是否存在某个项目。如果我尝试这样做,则会收到错误消息:
NotImplementedError: operator not implemented.
from PySide2 import QtGui
item = QtGui.QStandardItem()
item1 = QtGui.QStandardItem()
item == item1 # creates error
list1 = [item, item1]
item1 in list1 # creats error
我怎么了?我怎样才能做到这一点?我必须自己实现“ ==”运算符吗? 预先感谢您的帮助!
答案 0 :(得分:0)
运算符==
与__eq__
等效。用法类似于a.__eq__(b)
或a == b
。而且唯一的例外是the class没有该方法的实现。
医生确实说:
重新实现运算符,如果要控制项目比较的语义。使用
sortChildren()
或sort()
对项目进行排序时,运算符确定排序顺序。
答案 1 :(得分:0)
如评论中所述,您得到的错误是cursoruler(是PySide的残余物)的一部分。
我认为您有一个bug,而您想要的是检查是否有带有预定义文本的项目。如果是这样,则无需实现运算符==
,而可以使用XY problem方法:
from PySide2 import QtCore, QtGui
if __name__ == "__main__":
import sys
md = QtGui.QStandardItemModel()
for text in ("Hello", "Stack", "Overflow"):
md.appendRow(QtGui.QStandardItem(text))
words = ("Hello", "World")
for word in words:
if md.findItems(word, flags=QtCore.Qt.MatchExactly, column=0):
print(f"{word} exists")
else:
print(f"{word} not exists")
或者如果您要搜索其他角色,请使用findItems()方法:
from PySide2 import QtCore, QtGui
FooRole = QtCore.Qt.UserRole + 1000
if __name__ == "__main__":
import sys
md = QtGui.QStandardItemModel()
for i, text in enumerate(("Hello", "Stack", "Overflow")):
it = QtGui.QStandardItem(str(i))
it.setData(text, FooRole)
md.appendRow(it)
words = ("Hello", "World")
for word in words:
if md.match(
md.index(0, 0), FooRole, word, hits=1, flags=QtCore.Qt.MatchExactly
):
print(f"{word} exists")
else:
print(f"{word} not exists")