2012-12-30 45 views
7

我對Qt(PyQt-PySide)相當陌生。
我正在嘗試構建一個自定義小部件,它是一個菜單。但是,我已經走過了一條艱難的道路,我似乎無法將自己排除在外。我已閱讀文檔,但我不認爲有鼠標狀態,我可以驗證以查明鼠標光標是否位於給定小部件上方。
如何知道鼠標是否在小部件上?

我打電話給的mouseReleaseEvent函數。

例:

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),我添加了另一個例子來檢查鼠標位置 – 2012-12-30 19:44:39

+2

Hi @ X.Jacobs。這非常令人興奮!你的解決方案比我可憐的黑客更加優雅。 ;-) 優秀!你搖滾!我真的很感謝你的幫助。 – Phil

相關問題