2012-12-30 4 views
7

Ich bin ziemlich neu zu Qt (PyQt - PySide).
Ich versuche ein benutzerdefiniertes Widget zu erstellen, das ein Menü ist. Aber ich bin auf eine harte Tour gestoßen und ich kann mich anscheinend nicht beruhigen. Ich habe die Dokumentation gelesen, aber ich glaube nicht, dass es einen Mausstatus gibt, den ich überprüfen kann, um herauszufinden, ob sich der Mauszeiger über dem angegebenen Widget befindet.
Woher weiß ich, ob sich die Maus über dem Widget befindet?

Ich rufe eine Funktion auf mouseReleaseEvent von QWidget.

Bsp .:

def mouseReleaseEvent(self, e):  

Wenn dieses Ereignis ausgelöst wird, muss ich wissen, ob die Maus tatsächlich über das Widget oder außerhalb davon (das Widget von dem dieses Ereignis ausgelöst wird).

if mouseCursorOverSelf == True: 
     # do something .. 

Wie kann ich das erreichen? Was muss ich tun?

Vielen Dank!

+0

Können Sie etwas mehr Code, idealerweise mit einer vollständigen Probe bereitzustellen, die das Problem zeigt? Wenn Sie die Ereignismethoden für ein Widget überschreiben, werden sie implizit für dieses Widget aufgerufen, sofern Sie nicht die Maus greifen. –

+0

Hallo Andreas. Wenn Sie auf ein Widget klicken, halten Sie die Maustaste gedrückt, ziehen Sie den Mauszeiger jedoch über ein anderes Widget von ** diesem ** weg, wenn Sie die Maustaste loslassen, wird mouseReleaseEvent weiterhin ausgelöst. Ich muss zum Zeitpunkt der Veröffentlichung wissen, ob der Cursor über dem Widget ist. Wie kann ich das machen? – Phil

Antwort

11

Wenn Sie den Überblick behalten wollen, wenn die Maus betritt oder verlässt das Widget Sie so etwas wie diese verwenden:

#!/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_()) 

Wenn Sie wollen einfach nur prüfen, ob die Maus über das Widget ist, können Sie die QWidget::underMouse() Funktion:

#!/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_()) 

Ein anderes Verfahren würde die Überprüfung beinhalten, ob die Position der Maus in der inneren Geometrie des Widget ist:

#!/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

Hallo @ X.Jacobs. Vielen Dank für diese Antwort. Es hat mein Problem nicht genau gelöst, weil Aktionen (wenn die Maus heruntergefahren ist) die Methode unterMouse() fehlschlägt. Aber indem ich von deinem Beitrag gehorchte und ein wenig mehr Nachforschungen anstellte, implementierte ich eine Bedingung für mouseReleaseEvent. Was ich getan habe, ist, relative Mausposition mit event.pos() zu bekommen und seine .x() und .y() Werte gegen Breite und Höhe des Widgets zu überprüfen. Wenn die Position innerhalb der Grenzen liegt, habe ich das Ereignis fortgesetzt, wenn es nicht gestoppt wurde. – Phil

+0

@Phil Checkout meine [aktualisierte Antwort] (http://Stackoverflow.com/a/14092099/1006989), fügte ich ein weiteres Beispiel, um die Mausposition –

+2

Hi @ X.Jacobs zu überprüfen. Das ist sehr aufregend! Ihre Lösung ist verdammt viel eleganter als mein erbärmlicher Hack. ;-) Ausgezeichnet! Du schaukelst! Ich schätze wirklich all deine Hilfe. – Phil

Verwandte Themen