Sto cercando di fare un lettore audio semplice, ma voglio usare un'immagine (icona) come un pulsante.come codice un pulsante Immagine in PyQt?
risposta
ho visto che un sacco di persone hanno questo problema e ha deciso di scrivere un giusto esempio su come risolvere il problema. Puoi trovarlo qui: An example on how to make QLabel clickable La soluzione nel mio post risolve il problema estendendo QLabel in modo che emetta il segnale cliccato(). Il QLabel esteso simile a questa:
class ExtendedQLabel(QLabel):
def __init__(self, parent):
QLabel.__init__(self, parent)
def mouseReleaseEvent(self, ev):
self.emit(SIGNAL('clicked()'))
Spero che questo aiuta!
Qualcosa come questo, forse?
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_()
sì funziona, ma io non voglio un'immagine all'interno del pulsante, voglio un'immagine in sostituzione di un pulsante – Alquimista
È possibile creare sottoclasse QAbstractButton e creare un proprio pulsante. Ecco un semplice esempio di base:
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_())
Questo non è un modo molto semplice, ma ti dà un sacco di controllo. Puoi aggiungere una seconda pixmap e disegnarla solo quando il puntatore del mouse passa il mouse sul pulsante. È possibile modificare il comportamento di stretching corrente su quello di centraggio. Si può fare di avere non una forma rettangolare e così via ...
pulsante che cambia le immagini al passaggio del mouse e quando viene premuto:
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)
grazie, leggerò di più sottoclasse QAbstractButton – Alquimista
Trovo che questo sia il primo 'vero' soluzione che ho trovato. Ovvio e brillante. –
Sono molto nuovo a PySide/PyQt e mi sono imbattuto in questo, che è molto utile. Ma non riesco a capire come aggiungere la seconda pixmap quando si preme il pulsante o quando il mouse passa sopra. Sarebbe possibile per te elaborarlo? Grazie. – oxtay
Un'altra opzione è quella di utilizzare i fogli di stile. Qualcosa di simile:
from PyQt4 import QtCore, QtGui
import os
...
path = os.getcwd()
self.myButton.setStyleSheet("background-image: url(" + path + "/myImage.png);")
È possibile utilizzare QToolButton con la proprietà set autoraise true e lì è possibile impostare anche l'immagine.
Il problema con questa soluzione è che un evento di rilascio del mouse non è un clic. Per essere un clic il mouse deve scendere e salire all'interno dello stesso widget. Altrimenti l'utente potrebbe aver iniziato a fare clic da qualche altra parte, ha cambiato idea e ha spostato il mouse lontano dal pulsante-non-vuole-fare clic e su questo. Sorpresa! –