Фильтр данных из сигнала dataChanged в PyQt5 - PullRequest
0 голосов
/ 19 июня 2020

I wi sh, чтобы отфильтровать изменения, внесенные в QModelIndex в указанном c столбце (например, столбец 1), и что изменение было внесено в CheckStateRole, а не в DisplayRole. Мне нужно отфильтровать только тот факт, что CheckStateRole был изменен (без учета того, какое значение у него сейчас). Возможно ли это?

self.model.dataChanged.connect(lambda x: self.foo(x))

def foo(self, x):
    if x.column() == 1 and ???????:
    ...

Я пробовал x.data (QtCore.Qt.CheckStateRole) == 0 , но это не то, что мне нужно


вот пример кода для тестирования:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Mainwindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.table = QtWidgets.QTableView()
        self.setCentralWidget(self.table)

        self.data = [
            ['id_1', 'Blocks γ=500 GOST 31359-2007', 0.18, 0.22],
            ['id_2', 'Blocks γ=600 GOST 31359-2008', 0.25, 0.27],
            ['id_3', 'Insulation', 0.041, 0.042],
            ['id_4', 'Insulation', 0.041, 0.042]
            ]

        self.model = Materials(self.data)
        self.table.setModel(self.model)

        self.table.setSelectionBehavior(self.table.SelectRows)
        self.table.setSelectionMode(self.table.SingleSelection)

        for row in self.model.materials:
            key = row[0]
            self.model.check_states[key] = 0

        self.model.dataChanged.connect(lambda: print(self.model.materials))
        self.model.dataChanged.connect(lambda: print(self.model.check_states))

        self.model.dataChanged.connect(lambda x: self.foo(x))    ######################

    def foo(self, x):
        if x.column() == 1 #and ???????????????:
            print('success')

class Materials(QtCore.QAbstractTableModel):

    def __init__(self, materials = [[]], parent = None):
        super(Materials, self).__init__()
        self.materials = materials
        self.check_states = {}

    def rowCount(self, parent):
        return len(self.materials)

    def columnCount(self, parent):
        return len(self.materials[0])

    def data(self, index, role):

        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            column = index.column()
            value = self.materials[row][column]
            return value

        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            value = self.materials[row][column]
            return value


        if role == QtCore.Qt.CheckStateRole:
            if index.column() == 1:
                row = index.row()
                value = self.check_states.get(self.materials[row][0])
                return value

    def setData(self, index, value, role = QtCore.Qt.EditRole):

        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            self.materials[row][column] = value
            self.dataChanged.emit(index, index)
            return True

        if role == QtCore.Qt.CheckStateRole:
            if index.column() == 1:
                row = index.row()
                self.check_states[self.materials[row][0]] = value
                self.dataChanged.emit(index, index)
                return True

        return False

    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = Mainwindow()
    application.show()


    sys.exit(app.exec())

Цель состоит в том, чтобы напечатать «успех» не только тогда, когда изменение было в столбце 1, но и когда пользователь меняет статус флажка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...