PyQt4: 带清除按钮的 QLabel

1 投票
1 回答
2239 浏览
提问于 2025-04-17 12:22

首先,我来展示一下代码。

class XLineEdit(QtGui.QLineEdit):
  '''QLineEdit with clear button, which appears when user enters text.'''
  def __init__(self, pixmap, parent=None):
    QtGui.QLineEdit.__init__(self, parent)
    self.layout = QtGui.QHBoxLayout(self)
    self.image = QtGui.QLabel(self)
    self.image.setCursor(QtCore.Qt.ArrowCursor)
    self.image.setFocusPolicy(QtCore.Qt.NoFocus)
    self.image.setStyleSheet("border: none;")
    self.image.setPixmap(pixmap)
    self.image.setSizePolicy(
      QtGui.QSizePolicy.Expanding,
      QtGui.QSizePolicy.Expanding)
    self.image.adjustSize()
    self.image.setScaledContents(True)
    self.layout.addWidget(
      self.image, alignment=QtCore.Qt.AlignRight)
    self.textChanged.connect(self.changed)
    self.image.hide()

  def changed(self, text):
    if len(text) > 0:
      self.image.show()
    else: # if entry is empty
      self.image.hide()

这段代码创建了一个QLineEdit对象,并在它右侧放了一个自定义按钮,按钮是从QLabel做的。不过我遇到了两个问题:

  1. 如果我改变XLineEdit的字体(通过"XLineEdit对象".setFont(QFont)),那么图标按钮在竖着的时候看起来不错,但横着的时候就不好看了。看起来竖着的大小会随着QLineEdit字体的大小变化而变化,但横着的大小却不会。这个问题我该怎么解决呢?有没有其他方法可以创建带清除按钮的QLineEdit?我试过用自定义的QIcon创建QPushButton,但图标的大小完全没有变化(无论是竖着还是横着)。

  2. 我该如何在用户点击QLabel时创建一个新的信号?似乎没有类似于QPushButton的'clicked'的功能。

谢谢!

1 个回答

1

虽然@reclosedev已经在你的问题下评论并提供了一个关于清除按钮的C++示例链接,但我想补充一些关于你第二个问题的信息...

你可以通过重写MousePressEvent(鼠标按下事件)来创建一个可以点击的QLabel,并发出你自己的自定义信号。

从PyQt4.QtCore导入pyqtSignal
从PyQt4.QtGui导入QLabel, QStyle

class ClickLabel(QLabel):

    clicked = pyqtSignal()

    def __init__(self, *args, **kwargs)
        super(ClickLabel, self).__init__(*args, **kwargs)

    def mousePressEvent(self, event):
        event.accept()
        self.clicked.emit()

关于其他评论中提供的C++链接的一个说明。他们没有使用HBoxLayout,而是直接将按钮放在QLabel控件下,并使用resizeEvent(调整大小事件)来始终将按钮移动到QLabel的右侧。

撰写回答