2010-04-26 21 views

Respuesta

4

he visto que mucha gente tiene este problema y decidió escribir un buen ejemplo de cómo solucionarlo. Puede encontrarlo aquí: An example on how to make QLabel clickable La solución en mi publicación resuelve el problema extendiendo QLabel para que emita la señal de clic(). El QLabel extendida es como la siguiente:

class ExtendedQLabel(QLabel): 

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

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

espero que esto ayude!

+1

El problema con esta solución es que un evento de lanzamiento de mouse no es un clic. Para hacer clic, el mouse debe subir y bajar dentro del mismo widget. De lo contrario, el usuario puede haber comenzado a hacer clic en otro lugar, cambiar de opinión y alejar el mouse del botón-no-quieren-hacer clic y sobre este. ¡Sorpresa! –

3

Algo como esto, tal vez?

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í, funciona, pero no quiero una imagen dentro del botón, quiero, una imagen como reemplazo de un botón – Alquimista

18

Puede hacer una subclase QAbstractButton y hacer un botón propio. Aquí hay un ejemplo básico simple:

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

No es una manera súper fácil, pero le da mucho control. Puede agregar un segundo mapa de píxeles y dibujarlo solo cuando el puntero del mouse pase sobre el botón. Puede cambiar el comportamiento actual de estiramiento al centrado. Se puede hacer para tener no una forma rectangular y así sucesivamente ...

botón que cambia las imágenes en vuelo estacionario ratón y cuando se pulsa:

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

gracias, leeré más abot subclases QAbstractButton – Alquimista

+2

Me parece que este es el primer 'verdadero' solución que he encontrado. Obvio y brillante. –

+0

Soy muy nuevo en PySide/PyQt y me encontré con esto, que es muy útil. Pero no puedo encontrar la manera de agregar el segundo mapa de píxeles cuando se presiona el botón o cuando el mouse pasa. ¿Sería posible profundizar en eso? Gracias. – oxtay

1

Otra opción es el uso de hojas de estilo. Algo así como:

from PyQt4 import QtCore, QtGui 
import os 
... 

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

Puede usar QToolButton con la propiedad set autoraise true y allí puede establecer su imagen también.