Я пытаюсь сделать простой аудиоплеер, но я хочу использовать изображение (значок) в качестве кнопки.как код a Кнопка изображения в PyQt?
ответ
Я видел, что много людей имеют эту проблему и решил написать правильный пример о том, как это исправить. Вы можете найти его здесь: 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()'))
Я надеюсь, что это помогает!
Что-то вроде этого, может быть?
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_()
Да, это работает, я не хочу, чтобы изображение внутри кнопки, я хочу, изображение в качестве замены кнопки – Alquimista
Вы можете подклассифицировать 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)
спасибо, я прочитаю больше подкласса abot QAbstractButton – Alquimista
Я считаю, что это первый «истинный», решение, которое я нашел. Явный и блестящий. –
Я очень новичок в PySide/PyQt, и я наткнулся на это, что очень полезно. Но я не могу понять, как добавить вторую pixmap при нажатии кнопки или при наведении курсора мыши. Не могли бы вы рассказать об этом? Благодарю. – oxtay
Другой вариант заключается в использовании таблиц стилей. Что-то вроде:
from PyQt4 import QtCore, QtGui
import os
...
path = os.getcwd()
self.myButton.setStyleSheet("background-image: url(" + path + "/myImage.png);")
Вы можете использовать QToolButton с установленным свойством autoraise true, и там вы также можете установить свое изображение.
Проблема с этим решением заключается в том, что событие выключения мыши не является кликом. Чтобы щелкнуть мышью, мы должны опуститься внутри одного и того же виджета. В противном случае пользователь, возможно, начал щелкнуть в другом месте, передумал и отодвинул мышь от кнопки - они не хотят-щелкнуть и над этим. Сюрприз! –