Как заменить текст в QLineEdit при создании только одного элемента в истории отмен? - PullRequest
0 голосов
/ 06 марта 2020

Альтернативный вопрос: как мне заставить QLineEdit.clear() пропустить историю отмен?

Я подкласс QLineEdit, чтобы взять путь к CSV, который сбрасывается на него:

class QLineEditDragDrop(QtWidgets.QLineEdit):
    def __init__(self, parent=None):
        super().__init__()

    def dragEnterEvent(self, event):
        file_path = Path(event.mimeData().urls()[0].toLocalFile())
        if file_path.suffix == ".csv":
            event.accept()
        else:
            tool_tip = "Please provide a .csv file."
            QToolTip.showText(self.mapToGlobal(self.rect().topRight()), tool_tip,
                              self, self.rect(), 1000)
            event.ignore()

    def dropEvent(self, event):
        # Only accept the first selected file in case of multiple input
        file_path = Path(event.mimeData().urls()[0].toLocalFile())
        if file_path.suffix == ".csv":
            event.accept()
            self.setText(str(file_path))
        else:
            event.ignore()

Используя setText, событие не регистрируется в истории отмены, и пользователь не может использовать Ctrl-Z, чтобы вернуть предыдущее значение.

Поэтому я заменил

self.setText(str(file_path))

с

self.clear()
self.insert(str(file_path))

, но это создает два события в истории отмены, одно для очистки и одно для вставки, так что пользователь получает пустое поле на первом Ctrl + Z и должен нажать его снова, чтобы фактически вернуть предыдущий ввод.

Я также пытался использовать self.setText('') вместо self.clear(), но это полностью стирает историю отмены.

Как я могу иметь только одно событие в истории?

1 Ответ

0 голосов
/ 06 марта 2020

nb: Выяснили это во время написания вопроса, надеясь, что это решение поможет кому-то еще.

Несовершенное решение - использовать self.selectAll() вместо self.clear(). Поскольку insert() заменит любой выделенный текст, он заменяет весь существующий текст в поле, создавая только одно событие отмены. У него есть сторона выбора всего текста в поле, когда пользователь использует отмену, что я не считаю идеальным, но все же лучше, чем необходимость дважды нажимать Ctrl + Z .

...