Добавление флажка в правой части списка в PySide - PullRequest
0 голосов
/ 14 октября 2018

Я создаю список элементов, поддерживающих поиск, и мне интересно, что было бы для меня лучшим способом сохранить поддержку значка слева, в то же время вставляя флажок в дальнем правом углу для любого элементав списке?Я знаю, что просмотр списка по умолчанию не поддерживает флажок справа, только слева, который мне не нужен.

Будет ли работать QListView для этого, или я должен использовать QTableView или QTableWidget или что-то вроде этого?

Я пытаюсь сделать это:

enter image description here

код:

import os, sys
from PySide import QtGui, QtCore

class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent=parent)

        # controls
        self.lineEdit = QtGui.QLineEdit(self)
        self.list = QtGui.QListView(self)
        self.list.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        model = QtGui.QSortFilterProxyModel()
        model.setSortCaseSensitivity(QtCore.Qt.CaseSensitivity.CaseInsensitive)
        model.setSourceModel(QtGui.QStandardItemModel())
        model.setDynamicSortFilter(False)
        self.list.setModel(model)
        self.createModel()

        # layout
        vLayout = QtGui.QVBoxLayout(self)
        vLayout.addWidget(self.lineEdit)    
        vLayout.addWidget(self.list)

        # signals/slots
        self.lineEdit.textChanged.connect(self.filterItems)

    def createModel(self):
        codes = {
            'Zebra': QtCore.Qt.black,
            'Tiger': QtCore.Qt.yellow,
            'Gorilla': QtCore.Qt.gray,
            'Horse': QtCore.Qt.green,
            'Lion': QtCore.Qt.red
        }
        for k, v in codes.items():
            px = QtGui.QPixmap(12,12)
            px.fill(v)
            item = QtGui.QStandardItem(QtGui.QIcon(px), k)
            item.setCheckable(True)
            self.list.model().sourceModel().appendRow(item)
        self.list.model().sourceModel().sort(0, QtCore.Qt.AscendingOrder)

    def filterItems(self):
        filter_text = str(self.lineEdit.text()).lower()
        for row in range(self.list.model().rowCount()):
            if filter_text in str(self.list.model().item(row).text()).lower():
                self.list.setRowHidden(row, False)
            else:
                self.list.setRowHidden(row, True)


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Dialog()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
...