按下时如何将第二个像素图添加到抽象按钮 PySide/PyQt

How to add a second pixmap to an abstract button when pushed in PySide/PyQt

我对 PySide/PyQt 环境还很陌生。我正在尝试在顶部制作一个按钮菜单,并为每个按钮分配一个任务,以便在单击它们时,一个函数会在中央 window 上绘制一幅画。但我也想让按钮在单击时发生变化。

我认为如果我使用 QPushButton,这可能是一个需要解决的直截了当的问题,但我的按钮是图像并且我正在使用 HERE 建议的方法并使用 QAbstractButton 来创建它们。

那里提到

You can add second pixmap and draw it only when the mouse pointer is hover over button.

我正在努力做到这一点。我的问题是:

有哪些可能的方法可以实现这一点? QPushButtons 中的相同方法是否适用于此?如果是这样,有什么例子吗?

这是我的代码片段:

import sys
from PySide import QtGui, QtCore

BACKGROUND_COLOR = '#808080'
ICON_PATH_ACTIVE = 'icons/activ'
ICON_PATH_PASSIVE = 'icons/pasiv'

class MainWindow(QtGui.QMainWindow):

    def __init__(self, app=None):
        super(MainWindow, self).__init__()
        self.initUI()

    def initUI(self):

        dockwidget = QtGui.QWidget()

        self.setGeometry(200, 200, 400, 300)

        hbox = QtGui.QHBoxLayout()

        1_button = PicButton(QtGui.QPixmap("icons/pasiv/1.png"))
        2_button = PicButton(QtGui.QPixmap("icons/pasiv/2.png"))
        3_button = PicButton(QtGui.QPixmap("icons/pasiv/3.png"))

        hbox.addWidget(1_button)
        hbox.addWidget(2_button)
        hbox.addWidget(3_button)

        vbox = QtGui.QVBoxLayout()
        vbox.addLayout(hbox)
        vbox.setAlignment(hbox, QtCore.Qt.AlignTop)

        dockwidget.setLayout(vbox)

        self.setCentralWidget(dockwidget)   

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

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

def main():

    app = QtGui.QApplication(sys.argv)

    central = MainWindow()
    central.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

谢谢。

使用带有图标的常规 QPushButton。

iplay = QtGui.QIcon("path/play_icon.png")
ipause = QtGui.QIcon("path/pause_icon.png")
btn = QtGui.QPushButton(ipause, "", None)

def toggle_play():
    if btn.icon() == ipause:
        btn.setIcon(iplay)
        # Do Pause Action
    else:
        btn.setIcon(ipause)
        # Do Play Action
btn.clicked.connect(toggle_play)
btn.show()

如果你想要悬停功能,那么你必须继承 QPushButton

class MyButton(QtGui.QPushButton):

    custom_click_signal = QtCore.Signal()

    def enterEvent(self, event):
        super().enterEvent(event)
        # Change icon hove image here

    def leaveEvent(self, event):
        super().leaveEvent(event)
        # Change icon back to original image here.

    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        self.custom_click_signal.emit()
        # connect to signal btn.custom_click_signal.connect(method)

图标可能是最简单的方法,而不是手动管理绘制事件。还有 mousePressEvent 和 mouseReleaseEvents 如果你想让图标随着按住按钮的人而改变。