如何编写PyQt中的Image按钮?

Alq*_*sta 9 python qt pyqt pyqt4

我试图做简单的音频播放器,但我想用图像(图标)作为按钮.

ale*_*asi 20

您可以继承QAbstractButton并创建自己的按钮.这是一个基本的简单示例:

import sys
from PyQt4.QtGui import *

class PicButton(QAbstractButton):
    def __init__(self, pixmap, parent=None):
        super(PicButton, self).__init__(parent)
        self.pixmap = pixmap

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(event.rect(), self.pixmap)

    def sizeHint(self):
        return self.pixmap.size()

app = QApplication(sys.argv)
window = QWidget()
layout = QHBoxLayout(window)

button = PicButton(QPixmap("image.png"))
layout.addWidget(button)

window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

这不是一种超级简单的方法,但它可以让你获得很多控制权.您可以添加第二个像素图并仅在鼠标指针悬停在按钮上时绘制它.您可以将当前拉伸行为更改为居中行为.你可以让它没有矩形等等......

在鼠标悬停和按下时更改图像的按钮:

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class PicButton(QAbstractButton):
    def __init__(self, pixmap, pixmap_hover, pixmap_pressed, parent=None):
        super(PicButton, self).__init__(parent)
        self.pixmap = pixmap
        self.pixmap_hover = pixmap_hover
        self.pixmap_pressed = pixmap_pressed

        self.pressed.connect(self.update)
        self.released.connect(self.update)

    def paintEvent(self, event):
        pix = self.pixmap_hover if self.underMouse() else self.pixmap
        if self.isDown():
            pix = self.pixmap_pressed

        painter = QPainter(self)
        painter.drawPixmap(event.rect(), pix)

    def enterEvent(self, event):
        self.update()

    def leaveEvent(self, event):
        self.update()

    def sizeHint(self):
        return QSize(200, 200)
Run Code Online (Sandbox Code Playgroud)

  • 我发现这是我发现的第一个"真正的"解决方案.明显而辉煌. (2认同)

Ach*_*yan 5

您可以将QToolButton与set autoraise属性设置为true一起使用,也可以在其中设置图像。


Mik*_*len 4

我看到很多人都遇到这个问题,并决定编写一个适当的示例来解决它。您可以在这里找到它:关于如何使 QLabel 可点击的示例 我帖子中的解决方案通过扩展 QLabel 使其发出 clicked() 信号来解决该问题。扩展的 QLabel 看起来像这样:

class ExtendedQLabel(QLabel):

    def __init__(self, parent):
        QLabel.__init__(self, parent)

    def mouseReleaseEvent(self, ev):
        self.emit(SIGNAL('clicked()'))
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

  • 此解决方案的问题在于鼠标释放事件不是单击。要进行单击,鼠标必须在同一个小部件内向下和向上移动。否则,用户可能已经开始单击其他地方,改变主意并将鼠标从他们不想单击的按钮上移开并移到此按钮上。惊喜! (4认同)