Добавьте несколько завершающих qactions в lineedit

#python #pyqt5 #pyside2

#python #pyqt5 #pyside2

Вопрос:

Я пытаюсь выполнить lineEdit для поиска и фильтрации текста, аналогично тем, которые можно найти в таких приложениях, как vscode:

пример из vscode

Lineedit в Qt имеет действие кнопки очистки «in-build», похожее на то, что я ищу. Я заглянул в исходный код qlineedits c и создал модифицированную функцию, которая добавляет пользовательское действие clear. Возможно ли добавить несколько завершающих действий рядом друг с другом в lineedit, аналогичный примеру, упомянутому выше?

 class ULineEdit(QtWidgets.QLineEdit):
    def __init__(self,
            defaultText: str = "",
            isReadOnly: bool = False,
            isClearButtonEnabled: bool = True,
            parent=None
            ):

        super(ULineEdit, self).__init__()
        self.setText(defaultText)
        self.setReadOnly(isReadOnly)

        self.setClearButtonEnabled(isClearButtonEnabled)

        self.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)

    # override When readOnly is set to QLineEdit it disables QToolButton (clear button)
    def setClearButtonEnabled(self, enable: bool = True):
        if enable == True:
            clearAction = UAction.UClearAction(parent=self)
            clearAction.triggered.connect(self.clear)
            self.textChanged.connect(clearAction.dynamicVisibility)
            self.addAction(clearAction, QtWidgets.QLineEdit.TrailingPosition)
            # default state
            clearAction.dynamicVisibility(self.text())
        else:
            clearAction = UAction.getClearAction(self)
            if clearAction is not None:
                self.removeAction(clearAction)
  

Ответ №1:

Вы должны использовать addAction() метод QLineEdit :

 from PyQt5 import QtWidgets


class ULineEdit(QtWidgets.QLineEdit):
    def __init__(
        self,
        defaultText: str = "",
        isReadOnly: bool = False,
        isClearButtonEnabled: bool = True,
        parent=None,
    ):

        super(ULineEdit, self).__init__()
        self.setText(defaultText)
        self.setReadOnly(isReadOnly)

        self.setClearButtonEnabled(isClearButtonEnabled)

        self.setSizePolicy(
            QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed
        )

        foo_action = QtWidgets.QAction(self)
        icon = self.style().standardIcon(QtWidgets.QStyle.SP_DesktopIcon)
        foo_action.setIcon(icon)
        self.addAction(foo_action, QtWidgets.QLineEdit.TrailingPosition)

        bar_action = QtWidgets.QAction(self)
        icon = self.style().standardIcon(QtWidgets.QStyle.SP_DirIcon)
        bar_action.setIcon(icon)
        self.addAction(bar_action, QtWidgets.QLineEdit.TrailingPosition)


def main():
    app = QtWidgets.QApplication([])
    w = ULineEdit()
    w.show()
    app.exec_()


if __name__ == "__main__":
    main()
  

введите описание изображения здесь

Комментарии:

1. О, тогда извините за вопрос. Я пробовал это раньше, но Qt нарисовал действия друг над другом. Возможно, тогда я допустил другую ошибку. В любом случае, спасибо!