按下时如何将第二个像素图添加到抽象按钮 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 如果你想让图标随着按住按钮的人而改变。
我对 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 如果你想让图标随着按住按钮的人而改变。