1

問題は次のとおりです: QListWidget があります。この選択モードでは、1 つをクリックしてドラッグし、もう 1 つを離すことで複数のアイテムを選択できます。画面のどこかでマウスが離されたときに信号を発したいと思います(リスト内のアイテムの上で最初に押し下げられた場合のみ)。どうすればいいですか?

私がこれまでに調査したことから:QListWidgetにはitemSelectionChangedシグナルがありますが、これは、アイテムをドラッグしているときに新しいアイテムが選択されるたびにシグナルを発します

QListWidget には QAbstractItemView から継承された信号クリックがありますが、これは同じ項目でマウスが押されて離された場合にのみ機能します

QListWidget クラスを拡張して mouseReleaseEvent を定義しようとしましたが、それは元のイベントをオーバーライドし、リストの適切な動作を台無しにします

installEventFilter で空白のラベルを作成し、mouseReleasedFilter クラスを作成しようとしましたが、何とか機能しましたが、もっとエレガントな方法はありますか?

class mouseReleasedFilter(QtCore.QObject):
    def __init__(self, parent = None):
        super(mouseReleasedFilter, self).__init__(parent)
    def eventFilter(self, object, event):
        if event.type() == QtCore.QEvent.MouseButtonRelease:
        print 'released'
        return False
    return True

self.filter = mouseReleasedFilter(self)

self.label.installEventFilter(self.filter)

どんな助けにも感謝します

4

1 に答える 1

2

QListWidget クラスを拡張して mouseReleaseEvent を定義しようとしましたが、それは元のイベントをオーバーライドし、リストの適切な動作を台無しにします

それが正しい方法です。を使用してオーバーライドしているメソッドを実行するだけですsuper:

class MyList(QtGui.QListWidget):
    def mouseReleaseEvent(self, e):
        super(MyList, self).mouseReleaseEvent(e)
        print('released', e)

例:

from PyQt4 import QtGui
app = QtGui.QApplication([])
class MyList(QtGui.QListWidget):
    def mouseReleaseEvent(self, e):
        super(MyList, self).mouseReleaseEvent(e)
        print('released', e)

l = MyList()
l.addItems(['hello', 'world'])
l.show()

出力:

('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
于 2013-03-28T16:55:12.810 に答える