【问题标题】:Is possible to put an image instead of a button, and make it clickable?是否可以放置图像而不是按钮,并使其可点击?
【发布时间】:2014-01-25 18:28:42
【问题描述】:

是否可以将图像放入 GUI 应用程序并使其可点击?

我曾经做过这样的按钮:

img = QPixmap(15, 15)
img.fill(Qt.grey)
button = QPushButton(QIcon(img))
button.clicked.connect(self.button_click)

Link http://imagizer.imageshack.us/v2/800x600q90/834/kaqc.png

但我更喜欢使用图像,而不是使用带有图标的按钮..

【问题讨论】:

    标签: image qt python-3.x click pyside


    【解决方案1】:

    正如 yshurik 建议的那样,我有相同的要求并通过子类化 QLabel 来解决它。附加代码的数量非常有限。这是一个有效的实现:

    class CClickableLabel : public QLabel
    {
       Q_OBJECT
    public:
       CClickableLabel(QString text, QWidget *parent = 0) : QLabel(text, parent) {}
       ~CClickableLabel() {}
    
    signals:
       void clicked();
    
    protected:
       void mousePressEvent(QMouseEvent *event) { emit clicked(); }
    };
    

    创建一个实例CClickableLabel,使用setPixmap()设置图片并监听clicked()信号。这应该可以解决问题。

    【讨论】:

      【解决方案2】:

      这是一个简单的演示脚本,展示了如何制作可点击标签的网格:

      from random import shuffle
      from PySide import QtCore, QtGui
      
      class ClickableLabel(QtGui.QLabel):
          clicked = QtCore.Signal(str)
      
          def __init__(self, width, height, color):
              super(ClickableLabel, self).__init__()
              pixmap = QtGui.QPixmap(width, height)
              pixmap.fill(QtGui.QColor(color))
              self.setPixmap(pixmap)
              self.setObjectName(color)
      
          def mousePressEvent(self, event):
              self.clicked.emit(self.objectName())
      
      class Window(QtGui.QWidget):
          def __init__(self):
              QtGui.QWidget.__init__(self)
              layout = QtGui.QGridLayout(self)
              colors = 'red green blue orange purple yellow'.split()
              for row in range(len(colors)):
                  shuffle(colors)
                  for column, color in enumerate(colors):
                      label = ClickableLabel(25, 25, color)
                      label.clicked.connect(self.handleLabelClicked)
                      layout.addWidget(label, row, column)
      
          def handleLabelClicked(self, name):
              print('"%s" clicked' % name)
      
      if __name__ == '__main__':
      
          import sys
          app = QtGui.QApplication(sys.argv)
          window = Window()
          window.setGeometry(500, 300, 200, 200)
          window.show()
          sys.exit(app.exec_())
      

      【讨论】:

      • 这确实是一个很好的例子,但是如果我想改变点击标签上的颜色而不是打印颜色名称呢?
      • @CarloBeccarini。将像素图设置代码移动到ClickableLabel 的方法中(它可以将颜色作为参数)。然后,您可以在信号处理程序中使用self.sender() 来获取被点击的标签,并相应地更改颜色。
      【解决方案3】:

      我猜快速解决方案是 QLabel 的子类,使用 setPixmap() 放置图像并重新实现 mouseEvent() 以在按下/释放事件时提交信号 clicked()。因为它是 python (PyQt/PySide),所以它应该只有几行。通常我在需要一些可点击的图形时使用这种方法。

      【讨论】:

      • 我也试过了,在尝试按钮之前,但可能没有办法将图像作为小部件:/
      【解决方案4】:

      按钮具有样式,您可以在其上放置图像。

      【讨论】:

      • 我正在尝试制作一个迷宫编辑器,所以我更喜欢放一些看起来像网格的东西..
      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2016-12-01
      相关资源
      最近更新 更多