2010-04-26 4 views

ответ

4

Я видел, что много людей имеют эту проблему и решил написать правильный пример о том, как это исправить. Вы можете найти его здесь: An example on how to make QLabel clickable Решение в моем посте решает проблему, расширяя QLabel так, чтобы он выдавал сигнал clicked(). Увеличенный QLabel выглядит примерно так:

class ExtendedQLabel(QLabel): 

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

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

Я надеюсь, что это помогает!

+1

Проблема с этим решением заключается в том, что событие выключения мыши не является кликом. Чтобы щелкнуть мышью, мы должны опуститься внутри одного и того же виджета. В противном случае пользователь, возможно, начал щелкнуть в другом месте, передумал и отодвинул мышь от кнопки - они не хотят-щелкнуть и над этим. Сюрприз! –

3

Что-то вроде этого, может быть?

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

Да, это работает, я не хочу, чтобы изображение внутри кнопки, я хочу, изображение в качестве замены кнопки – Alquimista

18

Вы можете подклассифицировать 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_()) 

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

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

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

спасибо, я прочитаю больше подкласса abot QAbstractButton – Alquimista

+2

Я считаю, что это первый «истинный», решение, которое я нашел. Явный и блестящий. –

+0

Я очень новичок в PySide/PyQt, и я наткнулся на это, что очень полезно. Но я не могу понять, как добавить вторую pixmap при нажатии кнопки или при наведении курсора мыши. Не могли бы вы рассказать об этом? Благодарю. – oxtay

1

Другой вариант заключается в использовании таблиц стилей. Что-то вроде:

from PyQt4 import QtCore, QtGui 
import os 
... 

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

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