Zach G Zach G - 9 days ago 5
Python Question

Using PyQt4.QtGui.QMouseEvent in a QWidget

I am using a PyQt4.QMainscreen as my application interface, and I want to get the x and y coordinates of the mouse inside of a QWidget.

The documentation for QWidget is here:
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#mouseGrabber

and the documentation for QMouseEvent is here:
http://pyqt.sourceforge.net/Docs/PyQt4/qmouseevent.html

I've tried using

QWidget.mouseMoveEvent()


but there is an error that says:


{TypeError}QWidget.mouseMoveEvent(QMouseEvent): not enough arguments


It says it requires QMouseEvent as an argument, so I tried to create one:

mouseStatus = QMouseEvent()


but there is also an error:


TypeError: arguments did not match any overloaded call:
QMouseEvent(QEvent.Type, QPoint, Qt.MouseButton, Qt.MouseButtons, Qt.KeyboardModifiers): not enough arguments
QMouseEvent(QEvent.Type, QPoint, QPoint, Qt.MouseButton, Qt.MouseButtons, Qt.KeyboardModifiers): not enough arguments
QMouseEvent(QMouseEvent): not enough arguments


Can someone please help with how to use QMouseEvent with QWidget?

I want something that would work like this:

if myQWidget.mouseMoveEvent(QMouseEvent):
print QMouseEvent.x()
print QMouseEvent.y()


@eyllanesc

Here is the code

from PyQt4 import QtGui
from PyQt4.QtGui import QApplication
import sys

class Ui_MainWindow(object):
def setupUI(self, MainWindow):
self.textBrowser_1 = QtGui.QTextBrowser(self.tab)
self.textBrowser_2 = QtGui.QTextBrowser(self.tab)
self.widget_1 = QtGui.QWidget(self.tab)
self.widget_1.setMouseTracking(True)

class MyMainScreen(QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow() # This is from a python export from QtDesigner
# There is a QWidget inside that is self.ui.widget_1
# and 2 textBrowsers, textBrowser_1 and textBrowser_2
# I want to populate these 2 textBrowsers with the current x,y
# coordinates.

if __name__ == "__main__":
app = QApplication(sys.argv)
mainscreen = MyMainScreen()
mainscreen.show()
app.exec_()

Answer

This is my solution:

from PyQt4 import QtCore

from PyQt4 import QtGui
from PyQt4.QtGui import QApplication, QMainWindow
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(800, 132)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
        self.textBrowser_1 = QtGui.QTextBrowser(self.centralwidget)
        self.horizontalLayout.addWidget(self.textBrowser_1)
        self.textBrowser_2 = QtGui.QTextBrowser(self.centralwidget)
        self.horizontalLayout.addWidget(self.textBrowser_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        MainWindow.setStatusBar(self.statusbar)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


class MyMainScreen(QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()  # This is from a python export from QtDesigner
        self.ui.setupUi(self)
        self.setMouseTracking(True)
        self.ui.textBrowser_1.setMouseTracking(True)
        self.ui.textBrowser_2.setMouseTracking(True)
        self.ui.menubar.setMouseTracking(True)
        self.ui.statusbar.setMouseTracking(True)

    def setMouseTracking(self, flag):
        def recursive_set(parent):
            for child in parent.findChildren(QtCore.QObject):
                try:
                    child.setMouseTracking(flag)
                except:
                    pass
                recursive_set(child)
        QtGui.QWidget.setMouseTracking(self, flag)
        recursive_set(self)

    def mouseMoveEvent(self, event):
        pos = event.pos()
        self.ui.textBrowser_1.append(str(pos.x()))
        self.ui.textBrowser_2.append(str(pos.y()))
        QtGui.QMainWindow.mouseMoveEvent(self, event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainscreen = MyMainScreen()
    mainscreen.show()
    app.exec_()

This is my output:

enter image description here