PyQt4:带有清除按钮的QLabel

时间:2012-02-05 16:31:45

标签: python widget pyqt pyqt4

首先我会展示代码。

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的自定义按钮创建QLineEdit对象。我只有两个问题:

  1. 如果我更改XLineEdit(“XLineEdit对象”.setFont(QFont))的字体,图像按钮在垂直方向看起来会很好,但在水平方向看起来会很难看。看起来垂直尺寸会随着改变QLineEdit字体的大小而改变,但水平尺寸则不然。我怎样才能解决这个问题?有没有其他方法可以使用清除按钮创建QLineEdit?我尝试使用自定义QIcon创建QPushButton,但图标根本不会改变它的大小(既不垂直也不水平)。

  2. 当用户点击QLabel时,如何创建新信号? QPushButton的'clicked'似乎没有模拟。

  3. 谢谢!

1 个答案:

答案 0 :(得分: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的右侧。