PyQt4: 带清除按钮的 QLabel
首先,我来展示一下代码。
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做的。不过我遇到了两个问题:
如果我改变XLineEdit的字体(通过"XLineEdit对象".setFont(QFont)),那么图标按钮在竖着的时候看起来不错,但横着的时候就不好看了。看起来竖着的大小会随着QLineEdit字体的大小变化而变化,但横着的大小却不会。这个问题我该怎么解决呢?有没有其他方法可以创建带清除按钮的QLineEdit?我试过用自定义的QIcon创建QPushButton,但图标的大小完全没有变化(无论是竖着还是横着)。
我该如何在用户点击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的右侧。