QListWidget中字符后的屏蔽文本

Posted

技术标签:

【中文标题】QListWidget中字符后的屏蔽文本【英文标题】:Mask text after character in QListWidget 【发布时间】:2021-10-10 15:48:59 【问题描述】:

我有一个 QListWidget,我想在第一个 : 之后隐藏所有文本,而对于所有项目,完整的字符串仍然在那里供我使用。

例子:

List item | username:password

我想要什么:

List Item (Password is still there but hidden) | username

这只是为了让 UI 更干净,是否有任何内置的 PyQT 函数可以帮助我实现这一点,或者我是否必须使用 Python 提出其他解决方案?可重现的示例只是一个 QListWidget,其中包含 : 的项目。

【问题讨论】:

【参考方案1】:

一种可能的解决方案是使用委托:

import sys

from PyQt5 import QtCore, QtWidgets


class Delegate(QtWidgets.QStyledItemDelegate):
    def displayText(self, value, locale):
        text = super().displayText(value, locale)
        separator = ":"
        values = text.split(separator)
        if len(values) == 2:
            username, password = values
            mask_character = chr(
                QtWidgets.QApplication.style().styleHint(
                    QtWidgets.QStyle.SH_LineEdit_PasswordCharacter
                )
            )
            return separator.join([username, mask_character * len(password)])
        return text


def main():
    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QListWidget()
    delegate = Delegate(w)
    w.setItemDelegate(delegate)
    w.show()

    for i in range(10):
        text = f"usernamei:passwordi"
        item = QtWidgets.QListWidgetItem(text)
        item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
        w.addItem(item)
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

【讨论】:

这真的很酷,但我特别希望它做的是让分隔符后面的字符不可见,而不是密码字符。编辑:想通了,只是将 mask_character 更改为 "" 非常感谢!

以上是关于QListWidget中字符后的屏蔽文本的主要内容,如果未能解决你的问题,请参考以下文章

2 QListWidget之间如何交换多少项目?

pyqt5 qlistwidget 对大文本数据的性能

Qt - 如何从 QListWidget 中获取选定的自定义项目?

PyQt4:使用 QPushButton 小部件从 QList 小部件中删除项目

QT开发 QListWidget点击返回行号的问题

如果选择了多个项目,如何在 QListWidget 中打印多个项目