2010-04-26 12 views

risposta

4

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!

+1

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! –

3

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_() 
+0

sì funziona, ma io non voglio un'immagine all'interno del pulsante, voglio un'immagine in sostituzione di un pulsante – Alquimista

18

È 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) 
+0

grazie, leggerò di più sottoclasse QAbstractButton – Alquimista

+2

Trovo che questo sia il primo 'vero' soluzione che ho trovato. Ovvio e brillante. –

+0

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

1

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);") 
3

È possibile utilizzare QToolButton con la proprietà set autoraise true e lì è possibile impostare anche l'immagine.