#python #pyqt5 #pyside2
#python #pyqt5 #pyside2
Вопрос:
Я пытаюсь выполнить lineEdit для поиска и фильтрации текста, аналогично тем, которые можно найти в таких приложениях, как 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 нарисовал действия друг над другом. Возможно, тогда я допустил другую ошибку. В любом случае, спасибо!