比较对象并在列表中搜索

时间:2019-05-27 09:53:01

标签: python python-3.x pyside2

我使用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

我怎么了?我怎样才能做到这一点?我必须自己实现“ ==”运算符吗? 预先感谢您的帮助!

2 个答案:

答案 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")