2012-12-30 9 views
7

Jestem całkiem nowy w Qt (PyQt - PySide).
Próbuję utworzyć niestandardowy widget, który jest menu. Uderzyłem jednak w ciężką drogę i wydaje mi się, że nie jestem w stanie się rozejść. Czytałem dokumentację, ale nie sądzę, że istnieje stan myszy, który mogę zweryfikować, aby sprawdzić, czy kursor myszy znajduje się nad podanym widżetem.
Skąd wiadomo, czy mysz znajduje się nad widżetem?

Wywołanie funkcji na mouseReleaseEvent z QWidget.

Np .:

def mouseReleaseEvent(self, e):  

Gdy to zdarzenie jest wywoływane, muszę wiedzieć, czy mysz jest rzeczywiście przez widget lub poza nim (widget z których to zdarzenie jest wyzwalane).

if mouseCursorOverSelf == True: 
     # do something .. 

Jak mogę to osiągnąć? Co muszę zrobić?

Dziękuję bardzo!

+0

można dostarczyć trochę więcej kodu, najlepiej z pełnym próbki, które pokazuje swój problem? Jeśli nadpisujesz metody zdarzeń dla widżetu, są one niejawnie wywoływane dla widżetu 'this', chyba że złapiesz mysz. –

+0

Witaj Andreas. Jeśli klikniesz widżet, przytrzymaj przycisk myszy, ale przeciągnij kursor na inny widżet z dala od ** this ** po zwolnieniu myszy, mouseReleaseEvent jest nadal wyzwalane. Muszę wiedzieć w momencie wydania, czy kursor znajduje się nad widżetem. Jak mogę to zrobić? – Phil

Odpowiedz

11

Jeśli chcesz śledzić kiedy wchodzi mysz lub pozostawia widget można użyć coś takiego:

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

Jeśli chcesz po prostu sprawdzić, czy mysz jest nad widgetem, można użyć QWidget::underMouse() funkcji:

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

Innym sposobem obejmować sprawdzenie, czy pozycja myszy znajduje się w wewnętrznej geometrii 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

Hello @ X.Jacobs. Dziękuję bardzo za tę odpowiedź. Nie rozwiązało to mojego problemu właśnie z powodu działań przeciągania (gdy mysz jest wyłączona) nie powiodła się metoda UnderMouse(). Ale biorąc sygnał ze swojego wpisu i wykonując nieco więcej badań, zaimplementowałem warunek do mouseReleaseEvent. To, co zrobiłem, to uzyskać względną pozycję myszy przy użyciu funkcji event.pos() i sprawdzić jej wartości .x() i .y() względem szerokości i wysokości widgetu. jeśli pozycja znajduje się w obrębie granic, kontynuowałem wydarzenie, jeśli go nie zatrzymałem. – Phil

+0

@Phil Checkout my [updated answer] (http://stackoverflow.com/a/14092099/1006989), dodałem kolejny przykład, aby sprawdzić pozycję myszy –

+2

Hi @ X.Jacobs. To bardzo ekscytujące! Twoje rozwiązanie jest o wiele bardziej eleganckie niż mój żałosny hack. ;-) Doskonały! Rządzisz! Naprawdę naprawdę doceniam CAŁĄ pomoc. – Phil

Powiązane problemy