PyQt5 - 如何在“按钮”小部件中添加图像? | (不是图标)

Posted

技术标签:

【中文标题】PyQt5 - 如何在“按钮”小部件中添加图像? | (不是图标)【英文标题】:PyQt5 - How can I add image in 'pushbutton' widget? | (not icon) 【发布时间】:2021-07-08 09:14:04 【问题描述】:

是否有在 PushButton 小部件中添加图像的功能或选项?在这种情况下,添加的图像是指作为背景应用到整个小部件的图像,而不是作为“图标”的图像。我试图找到这个选项并使用“setStyleSheet”功能,但它不起作用。有什么问题,如何在按钮中添加图像?

btn6.setStyleSheet(
    "color: black;"
    "border-style: solid;"
    "border-width: 2px;"
    "border-color: #FFB400;"
    "border-radius: 3px;"
    "background-color: #FFD732;"
    "**background-image: url('D:\PyQt5_Tutorial\Test.png')")**

【问题讨论】:

有多种可能,但是:按钮是否还应该显示文本?应该根据按钮的大小调整图像的大小吗?如果是这样,它应该保持其纵横比吗?按钮边框是否应该像其他按钮一样显示?而且,最重要的是,“它不起作用”是什么意思?请注意,如果您使用上面的确切字符串,则路径错误有两个原因:单个反斜杠被视为转义,因此它们应该是 \`, then in Qt you need to use standard slashes for paths instead (D:/PyQt5...`) 但更重要的是,您应该始终使用相对路径。 顺便说一句,如果您想突出显示一段代码,请不要通过使用额外的字符来实现。很难理解您的代码是否真的正确(据我们所知,这可能只是一个错字)。使用 cmets,或仅指出您在问题正文中所指的行。 【参考方案1】:

您可以为此覆盖QPushButton.paintEvent()。并且不要忘记添加交互性以反映按钮的不同状态:凹陷、禁用、鼠标悬停、输入焦点。

from PyQt5 import QtWidgets, QtGui

class Button(QtWidgets.QPushButton):

    def __init__(self, parent = None) -> None:
        super().__init__(parent)
        self._image = None

    def setImage(self, image):
        self._image = image
        self.update()

class Button(QtWidgets.QPushButton):

    def __init__(self, parent = None) -> None:
        super().__init__(parent)
        self._image = None

    def setImage(self, image):
        self._image = image
        self.update()

    def paintEvent(self, event):
        if self._image is None:
            return
        opt = QtWidgets.QStyleOptionButton()
        self.initStyleOption(opt)

        rect = self.rect()

        painter = QtGui.QPainter(self)

        self.style().drawControl(QtWidgets.QStyle.CE_PushButtonBevel, opt, painter, self)

        if opt.state & QtWidgets.QStyle.State_Sunken:
            rect.adjust(2,2,2,2)
        
        painter.drawImage(rect, self._image)

        if opt.state & QtWidgets.QStyle.State_MouseOver:
            color = self.palette().color(QtGui.QPalette.Highlight)
            color.setAlpha(50)
            painter.fillRect(self.rect(), color)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    button = Button()
    button.setImage(QtGui.QImage("D:\\PyQt5_Tutorial\\Test.png"))
    button.show()

    app.exec()

【讨论】:

哦...!谢谢你的好意回答。我解决了这个问题。非常感谢!

以上是关于PyQt5 - 如何在“按钮”小部件中添加图像? | (不是图标)的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 在每个选项卡旁边添加添加和删除小部件按钮

在滚动区域小部件的 PyQt5 中添加 n 列

尽管更新了小部件,但 Pyqt5 更新的小部件未添加到布局中

如何在PyQt5中叠加小部件?

通过 pyqt5 动态添加和删除小部件

在 PyQt5 中使用浏览按钮添加适当的 FileDialog