4

まず、私は Python、Qt、および PySide を初めて使用するので、この質問が単純すぎると思われる場合はご容赦ください。

私がやろうとしているのは、PySide API を使用して構築された GUI のグリッドにたくさんの写真を表示することです。さらに、ユーザーが写真をクリックすると、その写真に対応する情報を表示できるようにしたいと考えています。さらに、写真の表示に使用されるコンテナ/ウィジェットで写真を変更できるようにしたいと思います。たとえば、写真のグリッド全体を最初から作成し直すことなく、グリッド内の写真を置き換えることができるようにする必要があります。

最初に QLabel を使用して QPixmap を表示しようとしましたが、(間違っているかどうかにかかわらず) ラベルのマウス クリックを検出する方法がないことに気付きました。いくつか検索した結果、QLabel (または他の関連クラス) をサブクラス化し、QWidget (QLabel の親クラス) の mousePressEvent() を何らかの方法でオーバーライドして、マウス クリック検出を有効にする必要があるという印象を受けました。問題は、それを行う方法がわからないこと、またはサブクラスのカスタマイズを行わずに QLabel 以外の写真を含めるために使用できる代替ウィジェットがあるかどうかです。

QLabel 以外のより適切なコンテナを提案して、写真のマウス クリックを検出しながら写真を表示したり、QLabel をサブクラス化してマウス クリックを検出できるようにするためのコード スニペットを提供したりできますか?

返信ありがとうございます。

4

2 に答える 2

6

信号を発信して別のスロットに接続する方法の例を追加しました。また、ドキュメントは非常に役立ちます

from PySide.QtCore import *
from PySide.QtGui import *

import sys


class Main(QWidget):


    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout  = QHBoxLayout(self)

        picture = PictureLabel("pic.png", self)
        picture.pictureClicked.connect(self.anotherSlot)

        layout.addWidget(picture)
        layout.addWidget(QLabel("click on the picture"))

    def anotherSlot(self, passed):
        print passed
        print "now I'm in Main.anotherSlot"


class PictureLabel(QLabel):

    pictureClicked = Signal(str) # can be other types (list, dict, object...)

    def __init__(self, image, parent=None):
        super(PictureLabel, self).__init__(parent)        
        self.setPixmap(image)

    def mousePressEvent(self, event):
        print "from PictureLabel.mousePressEvent"
        self.pictureClicked.emit("emit the signal")

a = QApplication([])
m = Main()
m.show()
sys.exit(a.exec_())
于 2012-04-17T05:08:57.523 に答える