Проблемы с выравниванием кнопок в виджете в pyqt5 - PullRequest
2 голосов
/ 11 марта 2019

Я пытался создать виджет с фоновым изображением и двумя кнопками (отменить и ок) с изображением и эффектом нажатия / увеличения, используя pyqt5 GUI языка Python, но у меня есть две проблемы:

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

Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

0 голосов
/ 11 марта 2019

Я не могу выровнять кнопки в центре виджета : если вы применили addStretch() до кнопки1, чтобы она была симметричной, вы должны установить еще одну addStretch() после кнопки2

События кнопок происходят дважды: QAbstractButton уже вызывает метод обновления при нажатии кнопки, поэтому нет необходимости подключать нажатые или отпущенные сигналы к методу update() или вызывать его в enterEvent() и leaveEvent() методы.

Учитывая вышеизложенное, решение:

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_())
...