ฉันจะรู้ได้อย่างไรว่าเมาส์อยู่เหนือวิดเจ็ต?

ฉันค่อนข้างใหม่กับ Qt (PyQt - PySide)
ฉันกำลังพยายามสร้างวิดเจ็ตแบบกำหนดเองซึ่งเป็นเมนู อย่างไรก็ตาม ฉันต้องเผชิญกับเส้นทางที่ยากลำบาก และดูเหมือนจะไม่สามารถจัดการตัวเองได้ ฉันได้อ่านเอกสารประกอบแล้ว แต่ฉันไม่คิดว่าจะมีสถานะของเมาส์ที่ฉันสามารถตรวจสอบได้เพื่อดูว่าเคอร์เซอร์ของเมาส์อยู่เหนือวิดเจ็ตที่กำหนดหรือไม่

ฉันกำลังเรียกใช้ฟังก์ชันตาม mouseReleaseEvent ของ QWidget

Ex.:

def mouseReleaseEvent(self, e):     

เมื่อเหตุการณ์นี้ถูกทริกเกอร์ ฉันต้องรู้ว่าจริงๆ แล้วเมาส์อยู่เหนือวิดเจ็ตหรืออยู่นอกวิดเจ็ต (วิดเจ็ตที่เหตุการณ์นี้ถูกทริกเกอร์)

    if mouseCursorOverSelf == True:
        # do something ..

ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร? ฉันต้องทำอย่างไร?

ขอบคุณมาก!


person Phil    schedule 30.12.2012    source แหล่งที่มา
comment
คุณช่วยระบุโค้ดเพิ่มเติมพร้อมตัวอย่างที่สมบูรณ์ซึ่งแสดงถึงปัญหาของคุณได้ไหม หากคุณแทนที่วิธีเหตุการณ์สำหรับวิดเจ็ต วิธีการเหล่านั้นจะถูกเรียกโดยปริยายสำหรับ this วิดเจ็ต เว้นแต่คุณจะหยิบเมาส์   -  person Andreas Fester    schedule 30.12.2012
comment
สวัสดีแอนเดรียส หากคุณคลิกวิดเจ็ต ให้วางเมาส์ลงแต่ลากเคอร์เซอร์ไปที่วิดเจ็ตอื่นให้ห่างจาก สิ่งนี้ เมื่อคุณปล่อยเมาส์ mouseReleaseEvent จะยังคงถูกทริกเกอร์ ฉันจำเป็นต้องรู้ในขณะที่ปล่อยว่าเคอร์เซอร์อยู่เหนือวิดเจ็ตหรือไม่ ฉันจะทำเช่นนี้ได้อย่างไร?   -  person Phil    schedule 30.12.2012


คำตอบ (2)


หากคุณต้องการติดตามว่าเมาส์เข้าหรือออกจากวิดเจ็ตเมื่อใด คุณสามารถใช้สิ่งนี้:

#!/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_())
person Community    schedule 30.12.2012
comment
สวัสดี @X.Jacobs ขอบคุณสำหรับคำตอบนี้มาก มันไม่ได้แก้ปัญหาของฉันอย่างแน่นอนเนื่องจากการลาก (เมื่อเมาส์ลง) ล้มเหลวภายใต้เมธอด underMouse() แต่การได้รับคิวจากโพสต์ของคุณและทำการค้นคว้าเพิ่มเติมอีกเล็กน้อย ฉันได้ใช้เงื่อนไขกับ mouseReleaseEvent สิ่งที่ฉันทำคือรับตำแหน่งเมาส์ที่สัมพันธ์กันโดยใช้ event.pos() และตรวจสอบค่า .x() และ .y() เทียบกับความกว้างและความสูงของวิดเจ็ต ถ้าตำแหน่งอยู่ในขอบเขตผมก็จัดงานต่อถ้าไม่หยุด - person Phil; 30.12.2012
comment
@Phil ชำระเงิน คำตอบที่อัปเดต ของฉัน ฉันได้เพิ่มตัวอย่างอื่นเพื่อตรวจสอบตำแหน่งเมาส์ - person ; 30.12.2012
comment
สวัสดี @X.Jacobs นี่มันน่าตื่นเต้นมาก! วิธีแก้ปัญหาของคุณนั้นสวยงามยิ่งกว่าแฮ็คที่น่าสงสารของฉันมาก ;-) ยอดเยี่ยม! คุณร็อค! ฉันซาบซึ้งจริงๆกับความช่วยเหลือของคุณทั้งหมด - person Phil; 30.12.2012

underMouse() คือสิ่งที่ควรใช้เพื่อพิจารณาว่าเมาส์ของคุณอยู่เหนือวิดเจ็ตหรือไม่
Usage: widget.underMouse()
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#underMouse

person David Lannan    schedule 26.04.2016