【问题标题】:PyQt4: QLabel with clear buttonPyQt4:带有清除按钮的 QLabel
【发布时间】:2012-02-06 02:20:04
【问题描述】:

首先我会展示代码。

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 object".setFont(QFont)),图像按钮在垂直方向看起来不错,但在水平方向看起来很难看。改变 QLineEdit 字体的大小似乎会改变垂直大小,但水平大小不会。我怎样才能解决这个问题?有没有其他方法可以使用清除按钮创建 QLineEdit?我尝试使用自定义 QIcon 创建 QPushButton,但图标根本不会改变它的大小(既不是垂直的,也不是水平的)。

  2. 当用户点击 QLabel 时如何创建新信号? QPushButton 的 'clicked' 好像没有类比。

谢谢!

【问题讨论】:

  • 您是否尝试过使用 QToolButton 来制作您希望可点击的图像? doc.qt.nokia.com/4.7-snapshot/qtoolbutton.html
  • 看看这个例子Lineedit with a clear button。但它是用 C++ 编写的。
  • @gfortune:谢谢,我试试看。
  • @reclosedev:我不会说 C++ 很好,但是这个例子是微不足道的,我想我已经理解了。谢谢,看来我找到了我要找的东西。

标签: python widget pyqt pyqt4


【解决方案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 的右侧。

【讨论】:

  • 谢谢,现在事情变得清楚了。 :-) 但我不明白为什么在初始化部分我们使用 *args、**kwargs 和 super。我可以这样写__init__def __init__(self, parent=None): QLabel.__init__(self, parent)吗?
  • 也可以不用子类化:self.image.mouseReleaseEvent = self.on_image_clickeddef on_image_clicked(self, event): ...。但它有点脏。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多