J'essaie de créer une application assez simple avec Pyside2 qui affiche certaines données dans un tableau que l'utilisateur peut modifier. Je veux que les cellules du tableau se remplissent automatiquement en fonction d'autres valeurs du tableau, donc je ...

0
bolt 15 mars 2021 à 07:27

1 réponse

Meilleure réponse

Tout widget qui n'a pas de parent sera une fenêtre et comme QLineEdit n'a pas de parent, vous observez le comportement que l'OP indique, c'est pourquoi la méthode createEditor a "parent" comme argument.

D'autre part, il est préférable de créer un QLineEdit personnalisé qui implémente facilement la gestion de l'ajout de suggestions au QCompleter via un modèle.

class AutoCompleteLineEdit(QtWidgets.QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._completer_model = QtGui.QStandardItemModel()
        completer = QtWidgets.QCompleter()
        completer.setModel(self._completer_model)
        self.setCompleter(completer)

    @property
    def suggestions(self):
        return [
            self._completer_model.item(i).text()
            for i in range(self._completer_model.rowCount())
        ]

    @suggestions.setter
    def suggestions(self, suggestions):
        self._completer_model.clear()
        for suggestion in suggestions:
            item = QtGui.QStandardItem(suggestion)
            self._completer_model.appendRow(item)


class QAutoCompleteDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(
        self,
        parent: QtWidgets.QWidget,
        option: QtWidgets.QStyleOptionViewItem,
        index: QtCore.QModelIndex,
    ) -> QtWidgets.QWidget:
        le = AutoCompleteLineEdit(parent)
        return le

    def setEditorData(self, editor: QtWidgets.QWidget, index: QtCore.QModelIndex):
        val = index.model().data(index, Qt.EditRole)
        options = index.model().unique_vals(index)
        editor.setText(val)
        editor.suggestions = options
0
eyllanesc 15 mars 2021 à 05:12