PyQt4: QLabel с кнопкой очистки - PullRequest
1 голос
/ 05 февраля 2012

Сначала я покажу код.

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 с кнопкой очистки?Я пытался создать QPushButton с пользовательским QIcon, но значок не меняет его размер вообще (ни вертикальный, ни горизонтальный).

  2. Как я могу создать новый сигнал, когда пользовательнажимает на QLabel?Похоже, что нет аналога для QPushButton 'clicked'.

Спасибо!

1 Ответ

1 голос
/ 05 февраля 2012

Хотя @reclosedev уже прокомментировал ваш вопрос со ссылкой на пример C ++ для аспекта кнопки очистки, я хотел бы добавить информацию о вашем втором вопросе ...

Вы можете создать кликабельный QLabel, перегрузив MousePressEvent и испустив собственный сигнал.

из PyQt4.QtCore import 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.

...