Bagaimana saya bisa tahu jika mouse berada di atas widget?

Saya cukup baru di Qt (PyQt - PySide).
Saya mencoba membuat widget khusus yang berupa menu. Namun saya telah menempuh jalan yang sulit dan sepertinya saya tidak dapat mengatur diri saya sendiri. Saya telah membaca dokumentasinya tetapi menurut saya tidak ada status mouse yang dapat saya verifikasi untuk mengetahui apakah kursor mouse berada di atas widget yang diberikan.

Saya memanggil fungsi pada mouseReleaseEvent dari QWidget.

Ex.:

def mouseReleaseEvent(self, e):     

Ketika acara ini dipicu, saya harus tahu apakah mouse sebenarnya berada di atas widget atau di luarnya (widget yang memicu acara ini).

    if mouseCursorOverSelf == True:
        # do something ..

Bagaimana saya bisa mencapainya? Apa yang harus saya lakukan?

Terima kasih banyak!


person Phil    schedule 30.12.2012    source sumber
comment
Bisakah Anda memberikan lebih banyak kode, idealnya dengan contoh lengkap yang menunjukkan masalah Anda? Jika Anda mengganti metode kejadian untuk sebuah widget, metode tersebut secara implisit dipanggil untuk widget this, kecuali Anda menggunakan mouse.   -  person Andreas Fester    schedule 30.12.2012
comment
Halo Andreas. Jika Anda mengeklik sebuah widget, arahkan mouse ke bawah tetapi seret kursor ke widget lain menjauh dari ini saat Anda melepaskan mouse, mouseReleaseEvent masih terpicu. Saya perlu tahu pada saat rilis apakah kursor berada di atas widget. Bagaimana saya bisa melakukan ini?   -  person Phil    schedule 30.12.2012


Jawaban (2)


Jika Anda ingin melacak kapan mouse masuk atau keluar dari widget, Anda dapat menggunakan sesuatu seperti ini:

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

Jika Anda hanya ingin memeriksa apakah mouse berada di atas widget, Anda dapat menggunakan fungsi 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_())

Metode lain akan melibatkan pemeriksaan apakah posisi mouse berada dalam geometri internal 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_())
person Community    schedule 30.12.2012
comment
Halo @X.Jacobs. Terima kasih banyak atas jawaban ini. Itu tidak menyelesaikan masalah saya karena tindakan drag (saat mouse turun) gagal dalam metode underMouse(). Namun dengan mengambil petunjuk dari postingan Anda dan melakukan sedikit riset, saya menerapkan kondisi pada mouseReleaseEvent. Apa yang saya lakukan adalah, mendapatkan posisi relatif mouse menggunakan event.pos() dan memeriksa nilai .x() dan .y() terhadap lebar dan tinggi widget. jika posisinya masih dalam batas, saya lanjutkan acaranya jika tidak dihentikan. - person Phil; 30.12.2012
comment
@Phil Periksa jawaban yang diperbarui saya, saya menambahkan contoh lain untuk memeriksa posisi mouse - person ; 30.12.2012
comment
Hai @X.Jacobs. Ini sangat menarik! Solusi Anda jauh lebih elegan daripada peretasan saya yang menyedihkan. ;-) Bagus sekali! Kamu keren! Saya sangat menghargai SEMUA bantuan Anda. - person Phil; 30.12.2012

underMouse() adalah yang harus digunakan untuk menentukan apakah mouse Anda berada di atas widget.
Usage: widget.underMouse()
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#underMouse

person David Lannan    schedule 26.04.2016