QTreeWidgetItems и QLineEdit echomodes - PullRequest
       56

QTreeWidgetItems и QLineEdit echomodes

0 голосов
/ 30 декабря 2018

К вопросу: как мне заставить 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 Ответ

0 голосов
/ 30 декабря 2018

Вы должны перезаписать метод 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)

enter image description here

...