2012-12-30 39 views
7

私はQt(PyQt-PySide)にかなり新しいです。
私はメニューであるカスタムウィジェットを構築しようとしています。しかし、私は厳しい道を歩いてしまったので、自分自身を分類することができないようです。私はドキュメントを読んだことがありますが、マウスカーソルが指定されたウィジェット上にあるかどうかを確認できるマウス状態はないと思います。
マウスがウィジェット上にあるかどうかはどのように知ることができますか?

私は、の機能をQWidgetに呼び出しています。このイベントがトリガされると

例:

def mouseReleaseEvent(self, e):  

、私はマウスがそれのウィジェットや外部(このイベントがトリガされるのウィジェット)の上に実際にあるかどうかを知る必要があります。

if mouseCursorOverSelf == True: 
     # do something .. 

どうすればこの問題を解決できますか?私は何をする必要がありますか?

ありがとうございました!

+0

あなたは、理想的にはあなたの問題を示して完全なサンプルで、いくつかのより多くのコードを提供することができますか?ウィジェットのイベントメソッドをオーバーライドすると、マウスをつかんでいなければ、それらは 'this'ウィジェットに対して暗黙的に呼び出されます。 –

+0

こんにちはアンドレアス。ウィジェットをクリックした場合は、マウスを押し下げたまま、マウスを離したときに** this **から離れた別のウィジェットにカーソルをドラッグすると、mouseReleaseEventは引き続きトリガーされます。私はカーソルがウィジェットの上にある場合、リリース時に知っておく必要があります。これどうやってするの? – Phil

答えて

11

あなたは、マウスは、あなたがこのようなものを使用することができますウィジェットに入るか、離れたときを追跡したい場合:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtCore, QtGui 

class mainwindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(mainwindow, self).__init__(parent) 

    def enterEvent(self, event): 
     print "Mouse Entered" 
     return super(mainwindow, self).enterEvent(event) 

    def leaveEvent(self, event): 
     print "Mouse Left" 
     return super(mainwindow, self).enterEvent(event) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    main = mainwindow() 
    main.show() 
    sys.exit(app.exec_()) 

あなただけのマウスがウィジェットの上にあるかどうかを確認したい場合は、あなたが使用することができますQWidget::underMouse()機能:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtCore, QtGui 

class mainwindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(mainwindow, self).__init__(parent) 

     self.button = QtGui.QPushButton("Check Mouse in 3 seconds") 
     self.button.clicked.connect(self.on_button_clicked) 

     self.layout = QtGui.QHBoxLayout(self) 
     self.layout.addWidget(self.button) 

    def mouseReleaseEvent(self, event): 
     if self.underMouse(): 
      print "Do something" 

     return super(mainwindow, self).mouseReleaseEvent(event) 

    @QtCore.pyqtSlot() 
    def on_button_clicked(self):  
     QtCore.QTimer.singleShot(3000, self.checkMouse) 

    def checkMouse(self): 
     print "Under Mouse: {0}".format(self.underMouse()) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    main = mainwindow() 
    main.show() 
    sys.exit(app.exec_()) 

もう一つの方法は、マウスの位置がウィジェットの内部形状内にあるかどうかをチェックする伴うだろう:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtCore, QtGui 

class mainwindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(mainwindow, self).__init__(parent) 

     self.setMouseTracking(True) 

    def mouseReleaseEvent(self, event): 
     posMouse = event.pos() 
     if self.rect().contains(posMouse): 
      print "Under Mouse" 

     return super(mainwindow, self).mouseReleaseEvent(event) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    main = mainwindow() 
    main.show() 
    main.resize(200, 200) 
    sys.exit(app.exec_()) 
+0

Hello @ X.Jacobs。この回答をありがとうございました。ドラッグ操作(マウスがダウンしたとき)が原因でunderMouse()メソッドが失敗するため、問題を解決できませんでした。しかし、あなたのポストからキューを取り、もう少し研究をして、私はmouseReleaseEventに条件を実装しました。私がしたのは、event.pos()を使って相対的なマウス位置を取得し、ウィジェットの幅と高さに対して.x()と.y()の値をチェックすることです。位置が境界内にあれば、私はそれを停止しなければイベントを続けた。 – Phil

+0

@Phil Checkout私の[更新された回答](http://stackoverflow.com/a/14092099/1006989)、マウス位置を確認する別の例を追加しました –

+2

こんにちは@ X.Jacobs。これはとてもエキサイティングです!あなたのソリューションは、私の哀れなハックよりもはるかにエレガントです。 ;-) 優れた!あなたはロック!本当に本当にありがとうございました。 – Phil

関連する問題