python - 在 pyqt5 中对齐小部件中的按钮时出现问题
问题描述
我一直在尝试使用python语言的pyqt5 GUI创建一个带有图像背景和两个按钮(取消和确定)的小部件,带有图像和下推/上推效果,但我有两个问题:
1 – 我无法对齐小部件中心的按钮
2 – 按钮事件发生两次
代码:
import sys
from PyQt5 import QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class PicButton(QAbstractButton):
def __init__(self, pixmap, pixmap_pressed, id_button, parent=None):
super(PicButton, self).__init__(parent)
self.pixmap = pixmap
self.pixmap_pressed = pixmap_pressed
self.id_buton = id_button
self.pressed.connect(self.update)
self.released.connect(self.update)
def paintEvent(self, event):
if self.isDown():
pix = self.pixmap_pressed
print("botao pressionado: ", self.id_buton)
else:
pix = self.pixmap
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(131, 82)
app = QApplication(sys.argv)
window = QWidget()
window.setGeometry(800, 450, 800, 450)
pixmap = QPixmap("background.png")
brush = QBrush(pixmap)
palette = QPalette()
palette.setBrush(QPalette.Background, brush)
window.setPalette(palette)
button1 = PicButton(QtGui.QPixmap("cancel_up.png"), QtGui.QPixmap("cancel_down.png"), "cancel")
button2 = PicButton(QtGui.QPixmap("ok_up.png"), QtGui.QPixmap("ok_down.png"), "ok")
layout = QHBoxLayout()
layout.addStretch(1)
layout.addWidget(button1)
layout.addWidget(button2)
layout.setAlignment(Qt.AlignCenter)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
在链接中获取图片:https ://www.filedropper.com/imagens
有人可以告诉我我做错了什么吗?
解决方案
我无法对齐小部件中心的按钮:如果您addStretch()
在 button1 之前应用了它以使其对称,则必须addStretch()
在 button2 之后设置另一个
按钮事件发生两次:当您按下按钮时,QAbstractButton 已经调用了更新方法,因此无需将按下或释放的信号连接到该update()
方法或在enterEvent()
andleaveEvent()
方法中调用它。
考虑到上面的解决方案是:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class PicButton(QtWidgets.QAbstractButton):
def __init__(self, pixmap, pixmap_pressed, id_button, parent=None):
super(PicButton, self).__init__(parent)
self.pixmap = pixmap
self.pixmap_pressed = pixmap_pressed
self.id_buton = id_button
def paintEvent(self, event):
if self.isDown():
pix = self.pixmap_pressed
print("botao pressionado: ", self.id_buton)
else:
pix = self.pixmap
painter = QtGui.QPainter(self)
painter.drawPixmap(event.rect(), pix)
def sizeHint(self):
return QtCore.QSize(131, 82)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window =QtWidgets. QWidget()
window.setGeometry(800, 450, 800, 450)
pixmap = QtGui.QPixmap("background.png")
brush = QtGui.QBrush(pixmap)
palette = QtGui.QPalette()
palette.setBrush(QtGui.QPalette.Background, brush)
window.setPalette(palette)
button1 = PicButton(QtGui.QPixmap("cancel_up.png"), QtGui.QPixmap("cancel_down.png"), "cancel")
button2 = PicButton(QtGui.QPixmap("ok_up.png"), QtGui.QPixmap("ok_down.png"), "ok")
layout = QtWidgets.QHBoxLayout(window)
layout.addStretch()
layout.addWidget(button1)
layout.addWidget(button2)
layout.addStretch()
window.show()
sys.exit(app.exec_())
推荐阅读
- python - 如何在目录的文本文件中插入逗号?
- javascript - 按住 Ctrl 键拖动时出错
- sql-server - 将数据从一台服务器复制到另一台服务器
- html - Css 侧边导航过渡
- mysql - 我可以使用相对路径将 csv 文件导入 mysql 吗?
- python - 使用 plotly-express 按值按降序排列条形图中的条形
- objective-c - 如何将 dispatch_block_t 类型的块传递给方法
- ios - iOS - 以约束为中心的 webview
- java - 为什么 EventListener 只在第一次工作?
- amazon-web-services - 使用 MySQL Workbench 连接到 Amazon Aurora 时出错