2012-12-30 10 views
7

Sono abbastanza nuovo in Qt (PyQt - PySide).
Sto provando a creare un widget personalizzato che è un menu. Tuttavia ho percorso una strada difficile e non riesco a risolverlo. Ho letto la documentazione ma non penso che ci sia uno stato del mouse che posso verificare per scoprire se il cursore del mouse si trova sopra il widget specificato.
Come posso sapere se il mouse si trova sopra il widget?

Sto chiamando una funzione su mouseReleaseEvent di un QWidget.

Es .:

def mouseReleaseEvent(self, e):  

Quando questo evento viene attivato, devo sapere se il mouse è in realtà sopra il widget o al di fuori di esso (il widget di cui viene attivato l'evento).

if mouseCursorOverSelf == True: 
     # do something .. 

Come posso ottenere questo risultato? Cosa devo fare?

Grazie mille!

+0

può fornire un po 'di codice, idealmente con un campione completo che mostra il vostro problema? Se si sostituiscono i metodi evento per un widget, vengono implicitamente chiamati per questo widget, a meno che non si prenda il mouse. –

+0

Ciao Andreas. Se fai clic su un widget, tieni premuto il mouse ma trascina il cursore su un altro widget lontano da ** questo ** quando rilasci il mouse, mouseReleaseEvent viene comunque attivato. Ho bisogno di sapere al momento del rilascio se il cursore si trova sopra il widget. Come posso fare questo? – Phil

risposta

11

Se si desidera tenere traccia di quando il mouse entra o esce il widget si può usare qualcosa di simile:

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

Se si vuole solo controllare se il mouse si trova sopra il widget, è possibile utilizzare la funzione 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_()) 

altro metodo comporterebbe controllare se la posizione del mouse è all'interno della geometria interna del widget:

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

Ciao @ X.Jacobs. Grazie mille per questa risposta. Non ha risolto il mio problema esattamente a causa delle azioni di trascinamento (quando il mouse è inattivo) non riescono con il metodo underMouse(). Ma prendendo spunto dal tuo post e facendo un po 'di ricerca ho implementato un condizionale per mouseReleaseEvent. Quello che ho fatto è, ottenere la posizione relativa del mouse usando event.pos() e controllare i suoi valori .x() e .y() rispetto alla larghezza e all'altezza del widget. se la posizione si trova entro i limiti, ho continuato con l'evento se non l'avessi fermato. – Phil

+0

@Phil Checkout my [risposta aggiornata] (http://stackoverflow.com/a/14092099/1006989), ho aggiunto un altro esempio per verificare la posizione del mouse –

+2

Ciao @ X.Jacobs. Questo è molto eccitante! La tua soluzione è molto più elegante del mio pietoso trucco. ;-) eccellente! Sei forte! Apprezzo davvero TUTTO il tuo aiuto. – Phil

Problemi correlati