2017-11-03 17 views
1

ボタンをクリックすると、QScrollAreaの内部にウィジェットを含む一連の水平レイアウトが生成されるというUIをMayaに構築しています。私は各行にシングル/ダブルクリックを認識させる方法を理解しようとしています。特定の行がクリックされたときに、クリックしたウィジェットを返して、何かできるようにしたいと思います。マウスのクリックを認識するために、おそらく行レイアウトにコンテナウィジェットを添付しなければならないと思っていますか?Pyside:QWidgetのシングルクリックとダブルクリックを検出する

私は一般的にシングルクリックとダブルクリックを認識して何かを印刷する方法を考え出しましたが、それをウィジェットにリンクする方法を考え出すのは苦労しています。

答えて

2

以下は、あなたが望むものの大半を行うデモです。重要なメソッドはchildAtで、指定されたポイントで子ウィジェットを取得します。明らかに、これが機能するためには、すべてのターゲットウィジェットがイベントを処理するウィジェットの子孫でなければなりません。 lastposチェックは、真のクリック事象(すなわち、同じウィジェット上でのマウス・プレス・アンド・リリース)を検出するために使用される。

import sys 
from PySide import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.scroll = QtGui.QScrollArea() 
     self.scroll.setWidgetResizable(True) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.scroll) 
     widget = QtGui.QWidget() 
     layout = QtGui.QVBoxLayout(widget) 
     for text in 'red green yellow purple orange blue'.split(): 
      item = QtGui.QFrame() 
      item.setObjectName(text) 
      item.setStyleSheet('background-color: %s' % text) 
      layout.addWidget(item) 
     self.scroll.setWidget(widget) 
     self._lastpos = None 

    def mousePressEvent(self, event): 
     self._lastpos = event.pos() 

    def mouseReleaseEvent(self, event): 
     widget = self.childAt(event.pos()) 
     if (widget is not None and self._lastpos is not None and 
      widget is self.childAt(self._lastpos)): 
      if widget.objectName(): 
       print('click:', widget.objectName()) 
     self._lastpos = None 

    def mouseDoubleClickEvent(self, event): 
     widget = self.childAt(event.pos()) 
     if widget is not None and widget.objectName(): 
      print('dblclick:', widget.objectName()) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 300, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

はい!あなたの例を実装し、それは働いた!だから私のスクロールエリア内の私の生成ウィジェットのすべてのために、私はそれらを辞書に格納し、私は再びそのウィジェットを呼び出すことができました(背景色を変更するような)self.mywidget [widget.objectName()] 。 objectNameを使ってウィジェットを編集するより良い方法があるのでしょうか、それを行う良い方法でしょうか? – ghost654

+2

@ ghost654辞書を使用するのは完全に合理的です。また、すでにウィジェットがあるので、クリックされたウィジェットを送信したカスタムの 'rowClicked'シグナルを送出してから、接続されたスロットにバックグラウンドを設定することもできます。 – ekhumoro

+0

左クリックボタンからmousePressEvent、mouseReleaseEvent、およびMouseDoubleClickEventだけを受け入れるように指定する方法はありますか?右クリックが同じことをしているように見えます。 右クリックの検索に使用できるイベントはありますか?ドロップダウンメニューを行うには def contextMenuEvent(self、event):右クリックについては – ghost654

関連する問題