是否可以放置图像而不是按钮,并使其可点击?

时间:2014-01-25 18:28:42

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

是否可以将图像放入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

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

4 个答案:

答案 0 :(得分:4)

我有同样的要求,并通过继承QLabel来解决它,正如yshurik建议的那样。额外代码的数量非常有限。这是一个有效的实施方案:

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()信号。这应该可以解决问题。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

按钮具有风格,你可以将图像放在它们上面。