как кодировать кнопку изображения в PyQt?

Я пытаюсь сделать простой аудиоплеер, но я хочу использовать изображение (значок) в качестве кнопки.


person Alquimista    schedule 26.04.2010    source источник


Ответы (5)


Я видел, что у многих людей есть эта проблема, и решил написать правильный пример того, как ее исправить. Вы можете найти его здесь: Пример на как сделать QLabel интерактивным Решение в моем сообщении решает проблему, расширяя QLabel так, чтобы он излучал сигнал clicked (). Расширенный QLabel выглядит примерно так:

class ExtendedQLabel(QLabel):

    def __init__(self, parent):
        QLabel.__init__(self, parent)

    def mouseReleaseEvent(self, ev):
        self.emit(SIGNAL('clicked()'))

Надеюсь, это поможет!

person MikaelHalen    schedule 06.05.2010
comment
Проблема с этим решением заключается в том, что событие отпускания мыши не является щелчком. Чтобы быть щелчком, мышь должна перемещаться вниз и вверх внутри одного и того же виджета. В противном случае пользователь мог начать щелкать где-нибудь еще, передумал и отодвинул указатель мыши от кнопки, которую они не хотят нажимать, и над этой. Сюрприз! - person Dale Wilson; 04.11.2016

Вы можете создать подкласс QAbstractButton и создать собственную кнопку. Вот простой простой пример:

import sys
from PyQt4.QtGui import *

class PicButton(QAbstractButton):
    def __init__(self, pixmap, parent=None):
        super(PicButton, self).__init__(parent)
        self.pixmap = pixmap

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(event.rect(), self.pixmap)

    def sizeHint(self):
        return self.pixmap.size()

app = QApplication(sys.argv)
window = QWidget()
layout = QHBoxLayout(window)

button = PicButton(QPixmap("image.png"))
layout.addWidget(button)

window.show()
sys.exit(app.exec_())

Это непростой способ, но он дает вам полный контроль. Вы можете добавить второе растровое изображение и нарисовать его, только когда указатель мыши находится над кнопкой. Вы можете изменить текущее поведение при растяжении на центрирующее. Можно сделать не прямоугольной формы и так далее ...

Кнопка, которая меняет изображения при наведении курсора мыши и при нажатии:

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class PicButton(QAbstractButton):
    def __init__(self, pixmap, pixmap_hover, pixmap_pressed, parent=None):
        super(PicButton, self).__init__(parent)
        self.pixmap = pixmap
        self.pixmap_hover = pixmap_hover
        self.pixmap_pressed = pixmap_pressed

        self.pressed.connect(self.update)
        self.released.connect(self.update)

    def paintEvent(self, event):
        pix = self.pixmap_hover if self.underMouse() else self.pixmap
        if self.isDown():
            pix = self.pixmap_pressed

        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(200, 200)
person alex vasi    schedule 26.04.2010
comment
Я считаю, что это первое «истинное» решение, которое я нашел. Очевидное и блестящее. - person Anti Earth; 30.10.2012
comment
Я новичок в PySide / PyQt, и я наткнулся на это, что очень полезно. Но я не могу понять, как добавить второе растровое изображение при нажатии кнопки или при наведении курсора мыши. Не могли бы вы подробнее остановиться на этом? Спасибо. - person oxtay; 03.09.2015
comment
@oxtay Я обновил свой ответ и добавил еще один пример. - person alex vasi; 13.09.2015
comment
Спасибо @alexvasi. Это было очень полезно. Возможно, это совсем другой вопрос, но есть ли способ сохранить pixmap_pressed в качестве значка, пока не будет нажата другая кнопка? Сейчас он меняется только при наведении курсора мыши или нажатии на мгновение, но возвращается в нормальное состояние. Я в основном хочу создать то же поведение, что и активные вкладки в браузере, с почти такой же функциональностью. - person oxtay; 23.09.2015
comment
@oxtay прочитайте о свойствах проверяемых и проверяемых. - person alex vasi; 23.09.2015

Вы можете использовать QToolButton с установленным свойством autoraise true, и там вы также можете установить свое изображение.

person Achayan    schedule 29.06.2011

Может, что-то вроде этого?

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

app = QApplication(sys.argv)
widget = QWidget()
layout = QHBoxLayout()
widget.setLayout(layout)
button = QPushButton()
layout.addWidget(button)
icon = QIcon("image.png")
button.setIcon(icon)
widget.show()
app.exec_()
person Jesse Aldridge    schedule 26.04.2010
comment
да, это работает, но я не хочу изображение внутри кнопки, я хочу изображение в качестве замены кнопки - person Alquimista; 26.04.2010

Другой вариант - использовать таблицы стилей. Что-то типа:

from PyQt4 import QtCore, QtGui
import os
...

path = os.getcwd()
self.myButton.setStyleSheet("background-image: url(" + path + "/myImage.png);")
person swanson    schedule 27.04.2010