Как управлять видимостью данных в PyQt5 QTableWidgetItem - PullRequest
1 голос
/ 08 января 2020

Я хочу сделать некоторые данные скрытыми в QTableWidget, пока не будет нажата указанная ячейка c. Сейчас мне удается отображать только «*» вместо фактического значения. Я думаю, что я мог бы как-то соединиться с действием, когда указанная ячейка c нажата и заменила значение щелкаемой ячейки. Я также знаю, что есть функция setData (), которая может быть вызвана в QTableWidgetItem и дать мне требуемое поведение. Но я не могу найти никакого полезного примера для Python реализации qt. Как лучше всего решить эту проблему?

def setTableValues(self):
    self.table.setRowCount(len(self.tableList))
    x = 0
    for acc in self.tableList:
        y = 0
        for val in acc.getValuesAsList():
            if isinstance(val,Cipher):
                val = "*"*len(val.getDecrypted())
            item = QTableWidgetItem(val)
            self.table.setItem(x,y,item)
            y += 1
        x += 1
    self.table.resizeRowsToContents()
    self.table.resizeColumnsToContents()

1 Ответ

2 голосов
/ 08 января 2020

Вы можете связать флаг с ролью, которая указывает на видимость текста, а затем использовать делегата, чтобы скрыть текст. Этот флаг будет меняться при нажатии элементов:

from PyQt5 import QtCore, QtGui, QtWidgets

VisibilityRole = QtCore.Qt.UserRole + 1000


class VisibilityDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        if not index.data(VisibilityRole):
            option.text = "*" * len(option.text)


class TableWidget(QtWidgets.QTableWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        delegate = VisibilityDelegate(self)
        self.setItemDelegate(delegate)
        self.visibility_index = QtCore.QModelIndex()
        self.pressed.connect(self.on_pressed)

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def on_pressed(self, index):
        if self.visibility_index.isValid():
            self.model().setData(self.visibility_index, False, VisibilityRole)
        self.visibility_index = index
        self.model().setData(self.visibility_index, True, VisibilityRole)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = TableWidget(10, 4)
    for i in range(w.rowCount()):
        for j in range(w.columnCount()):
            it = QtWidgets.QTableWidgetItem("{}-{}".format(i, j))
            w.setItem(i, j, it)
    w.show()
    w.resize(640, 480)

    sys.exit(app.exec_())
...