繁体   English   中英

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

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

我是PySide / PyQt环境的新手。 我试图在顶部制作一个按钮菜单,并为每个按钮分配一个任务,以便在单击它们时,功能可以在中央窗口上绘画。 但是我也想在单击按钮时进行更改。

我认为如果使用QPushButton,这可能是一个难以解决的问题,但是我的按钮是图像,并且我在这里使用建议的方法并使用QAbstractButton创建它们。

那里提到

您可以添加第二个像素图并仅在鼠标指针悬停在按钮上时绘制它。

我正试图做到这一点。 我的问题是这样的:

有什么可能的方法来实现这一目标? 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM