QTreeWidgetItems и QLineEdit echomodes
К вопросу: Как я могу получить QTreeWidgetItem для соблюдения QLineEdits setEchoMode(QLineEdit.Password)?
Я бился головой об стену для этого в течение последнего дня: у меня есть подкласс QTreeWidgetItem (который просто добавляет одно дополнительное поле к классу)
Я создаю его экземпляр, добавляю его в мой TreeWidget:
twi = DIMTreeWidgetItem.DIMTreeWidgetItem(uuid.uuid4(), [field_name, '<Empty>'])
...
self.ui_instance.main_window.treeWidget.addTopLevelItem(twi)
Я редактирую этот экземпляр на основе двойного щелчка этого элемента с помощью:
self.ui_instance.main_window.treeWidget.editItem (item, column) Это отлично работает.
У меня есть делегат, прикрепленный к этому столбцу, который просто:
def __init__(self, parent=None, *args):
QStyledItemDelegate.__init__(self, parent, *args)
def createEditor(self, parent, option, index):
le = QLineEdit('', parent)
le.setEchoMode(QLineEdit.PasswordEchoOnEdit)
return le
Но, похоже, это влияет только на элемент во время редактирования. Как правильно скрыть содержимое элемента treewidgetite после редактирования?
Даже если кто-то может пролить свет на то, как это сделать в C++, я уверен, что смогу перевести его на pyside2.
1 ответ
Вы должны перезаписать метод displayText делегата, чтобы вернуть ●
символ так много раз превышает длину текста:
from PySide2 import QtCore, QtWidgets
class PasswordDelegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, parent, option, index):
editor = QtWidgets.QLineEdit(parent)
editor.setEchoMode(QtWidgets.QLineEdit.PasswordEchoOnEdit)
return editor
def displayText(self, value, locale):
character = "●" # u"\u25CF"
v = character * len(value)
return super(PasswordDelegate, self).displayText(v, locale)
class EditableItem(QtWidgets.QTreeWidgetItem):
def __init__(self, *args, **kwargs):
super(EditableItem, self).__init__(*args, **kwargs)
self.setFlags(self.flags() | QtCore.Qt.ItemIsEditable)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
tree_widget = QtWidgets.QTreeWidget()
self.setCentralWidget(tree_widget)
for i in range(5):
parent_item = EditableItem(tree_widget, ["{}".format(i)])
for j in range(5):
child_item = EditableItem(["{}-{}".format(i, j)])
parent_item.addChild(child_item)
tree_widget.expandAll()
delegate = PasswordDelegate(tree_widget)
tree_widget.setItemDelegate(delegate)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
Если вы хотите определить, к какому элементу применить, вы можете переопределить метод initStyleOption, поскольку он имеет информацию QModelIndex, связанную с элементом, в следующем примере он будет применяться только к элементам, у которых есть родительский элемент.
class PasswordDelegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, parent, option, index):
editor = QtWidgets.QLineEdit(parent)
editor.setEchoMode(QtWidgets.QLineEdit.PasswordEchoOnEdit)
return editor
def initStyleOption(self, option, index):
super(PasswordDelegate, self).initStyleOption(option, index)
if index.parent().isValid():
character = "●" # u"\u25CF"
option.text = character * len(option.text)