带有屏蔽密码列的 QTableWidget

QTableWidget with a masked password column

是否可以屏蔽某些包含密码的单元格或我使用 PyQt5 创建的 QTableWidget 中的列。我在这里找不到任何选项,搜索也没有提出任何解决方案。

一种可能的解决方案是通过委托更改显示的文本:

from PyQt5 import QtWidgets


class PasswordDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        if index.column() == 0:
            style = option.widget.style() or QtWidgets.QApplication.style()
            hint = style.styleHint(QtWidgets.QStyle.SH_LineEdit_PasswordCharacter)
            option.text = chr(hint) * len(option.text)


def main():
    import sys

    app = QtWidgets.QApplication(sys.argv)
    view = QtWidgets.QTableWidget(10, 4)
    delegate = PasswordDelegate(view)
    view.setItemDelegate(delegate)
    for i in range(view.rowCount()):
        it = QtWidgets.QTableWidgetItem()
        it.setText("password-{}".format(i))
        view.setItem(i, 0, it)
    view.show()
    view.resize(640, 480)
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

感谢@eyllanesc 的分享,我实际上能够通过

在我的 tableview 和其他地方的特定列上重用它
class PasswordDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        style = option.widget.style() or QtWidgets.QApplication.style()
        hint = style.styleHint(QtWidgets.QStyle.SH_LineEdit_PasswordCharacter)
        option.text = chr(hint) * len(option.text)

这使得我不必对 class 中的列进行硬编码,而只需将委托应用于表视图或模型中我希望它适用的特定列。通过 setItemDelegateForColumn 查看更多相关信息 here

self.password_delegate = PasswordDelegate()
self.tableView_connections.setItemDelegateForColumn(4, self.password_delegate)