Изменение значка кнопки при нажатии

Я пытаюсь создать приложение с графическим интерфейсом, которое меняет значок на правой кнопке! Это мой простой код:

import sys
from PySide.QtCore import *
from PySide.QtGui import *

class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi()

    def setupUi(self):
        widget = QWidget()
        layout = QGridLayout()
        self.buttons = list()

        for x in range(3):
            row = list()
            for y in range(3):
                button = QPushButton(QIcon('Empty-Cell.png'), '{},{}'.format(x, y))
                button.clicked.connect(self.button_click)
                row.append(button)
                layout.addWidget(button, x, y)
            self.buttons.append(row)

        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def button_click(self):
        # Change icon HERE!

def main():
    app = QApplication(sys.argv)
    ui = Ui_MainWindow()
    ui.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

а вот картинка:

Ссылка на приложение с графическим интерфейсом

Я пытался часами, но я все еще не могу этого сделать, есть идеи? Я также хотел бы использовать виджет изображения вместо кнопки, метки или чего-то еще, если это возможно.

Благодарю вас!


person Carlo Beccarini    schedule 25.01.2014    source источник


Ответы (1)


Вы можете использовать QObject::sender, чтобы получить нажатую кнопку.

def button_click(self):
    test_pixmap = QPixmap(16, 16)
    test_pixmap.fill(Qt.red)
    self.sender().setIcon(QIcon(test_pixmap))
person Pavel Strakhov    schedule 25.01.2014
comment
Что ж, это работает! Есть ли способ сделать изображение виджета кликабельным вместо использования кнопки? - person Carlo Beccarini; 25.01.2014
comment
Что вы подразумеваете под изображением виджета? Вы можете получать события кликов любого виджета (например, QLabel, который может отображать растровые изображения), установив на него фильтр событий. т.е. вызовите self.label.installEventFilter(self) и реализуйте метод eventFilter вашего класса главного окна. - person Pavel Strakhov; 26.01.2014