添加多个尾随 qactions 到 lineedit
Add multiple trailing qactions to lineedit
我正在尝试完成用于文本搜索和过滤的 lineEdit,类似于 vscode:
等应用程序中的那些
Qt 的 lineedit 有一个“内置”清除按钮操作,与我正在寻找的类似。我查看了 qlineedits c++ 源代码并构建了一个修改后的函数,它添加了一个自定义清除操作。是否可以将多个尾随操作彼此相邻地添加到与上面引用的示例类似的行编辑中?
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)
您必须使用 addAction()
method of 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()
我正在尝试完成用于文本搜索和过滤的 lineEdit,类似于 vscode:
等应用程序中的那些Qt 的 lineedit 有一个“内置”清除按钮操作,与我正在寻找的类似。我查看了 qlineedits c++ 源代码并构建了一个修改后的函数,它添加了一个自定义清除操作。是否可以将多个尾随操作彼此相邻地添加到与上面引用的示例类似的行编辑中?
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)
您必须使用 addAction()
method of 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()