Как кодировать кнопку изображения в PyQt?

Я пытаюсь сделать простой аудиоплеер, но я хочу использовать изображение (значок) в качестве кнопки.

6 ответов

Решение

Я видел, что у многих людей есть эта проблема, и решил написать хороший пример того, как ее исправить. Вы можете найти его здесь: Пример того, как сделать QLabel кликабельным. Решение в моем посте решает проблему, расширяя QLabel так, чтобы он испускал сигнал clicked(). Расширенный QLabel выглядит примерно так:

class ExtendedQLabel(QLabel):

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

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

Надеюсь, это поможет!

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

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

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

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)

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

Может быть как то так?

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

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

from PyQt4 import QtCore, QtGui
import os
...

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

Если вы хотите использовать изображение вместоQPushButtonв строке меню или на панели инструментов , вы можете сделать это черезQAction. Рабочий пример:

      from PyQt5 import QtWidgets, QtGui, QtCore
import sys

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):

        super(MainWindow, self).__init__()
        self.setWindowTitle("Clickable Image in Menubar and Toolbar")

        action = QtWidgets.QAction(
            QtGui.QIcon("image.png"), "&Clickable Image", self)
        action.triggered.connect(self.test)

        menubar = self.menuBar()
        menubar.addAction(action)
        toolbar = QtWidgets.QToolBar("Toolbar")
        toolbar.setIconSize(QtCore.QSize(20, 20))
        toolbar.addAction(action)
        self.addToolBar(toolbar)

    def test(self):

        print("Image clicked.")

app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Другие вопросы по тегам