【问题标题】:how code a Image button in PyQt?如何在 PyQt 中编写图像按钮?
【发布时间】:2011-02-12 06:04:36
【问题描述】:

我正在尝试做简单的音频播放器,但我想使用图像(图标)作为按钮。

【问题讨论】:

    标签: python qt pyqt pyqt4


    【解决方案1】:

    您可以继承 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)
    

    【讨论】:

    • 我发现这是我发现的第一个“真正”的解决方案。明显而精彩。
    • 我对 PySide/PyQt 很陌生,我遇到了这个,这非常有用。但我不知道如何在按下按钮或鼠标悬停时添加第二个像素图。你能详细说明一下吗?谢谢。
    • @oxtay 我已经更新了我的答案并添加了另一个示例。
    • 谢谢@alexvasi。这很有帮助。这可能是另一个问题,但是有没有办法将pixmap_pressed 保留为图标,直到按下另一个按钮?现在,它仅在鼠标悬停或按下一会儿时才会改变,但它会恢复正常。我基本上想在具有几乎相同功能的浏览器上创建与活动选项卡相同的行为。
    • @oxtay 了解checkable and checked 属性。
    【解决方案2】:

    您可以将 QToolButton 与 set autoraise 属性一起使用,您也可以在那里设置您的图像。

    【讨论】:

      【解决方案3】:

      我看到很多人都有这个问题,并决定写一个适当的例子来说明如何解决它。你可以在这里找到它: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()'))
      

      我希望这会有所帮助!

      【讨论】:

      • 这个解决方案的问题是鼠标释放事件不是点击。要成为点击鼠标必须在同一个小部件内上下移动。否则,用户可能已经开始点击其他地方,改变了主意,将鼠标从按钮上移开——他们不想点击——然后移到这个按钮上。惊喜!
      【解决方案4】:

      可能是这样的吧?

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

      【讨论】:

      • 是的,它工作,但我不想要按钮内的图像,我想要一个图像作为按钮的替换
      【解决方案5】:

      另一种选择是使用样式表。比如:

      from PyQt4 import QtCore, QtGui
      import os
      ...
      
      path = os.getcwd()
      self.myButton.setStyleSheet("background-image: url(" + path + "/myImage.png);")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 2021-12-18
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        相关资源
        最近更新 更多