Как включить отслеживание мыши при движении в QTabWidget - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть приложение QApplication в PyQt5, которое отслеживает движение мыши и обновляет метку координатами x & y. Это работает, как и ожидалось, когда движение мыши происходит внутри основного QDialog. Однако, когда мышь перемещается в QTabWidget, обновление метки прекращается. Он возобновится снова, если я нажму (удержу) и перетащу мышь, но остановлюсь снова, как только будет отпущена левая кнопка. Почему это так, и как я могу изменить свой код, чтобы метка продолжала обновляться при перемещении мыши в QTabWidget?

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class MyForm(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.show()

    def mouseMoveEvent(self, event):
        x = event.x()
        y = event.y()
        text = "x: {0}, y: {1}".format(x, y)
        self.ui.labelTracking.setText(text)     

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(653, 450)
        Dialog.setMouseTracking(True)
        self.tabWidget = QtWidgets.QTabWidget(Dialog)
        self.tabWidget.setGeometry(QtCore.QRect(160, 0, 481, 451))
        self.tabWidget.setMouseTracking(True)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.labelTracking = QtWidgets.QLabel(Dialog)
        self.labelTracking.setGeometry(QtCore.QRect(10, 80, 131, 61))
        self.labelTracking.setMouseTracking(True)
        self.labelTracking.setText("")
        self.labelTracking.setObjectName("labelTracking")

        self.retranslateUi(Dialog)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Dialog", "Test Tab"))


if __name__=="__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 24 апреля 2020

Это будет работать, если вы включите отслеживание мыши на виджете внутри QTabWidget и установите его mouseMoveEvent на тот, который вы определили.

class MyForm(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.tab.mouseMoveEvent = self.mouseMoveEvent
        self.show()

    def mouseMoveEvent(self, event):
        pos = event.windowPos().toPoint()
        x = pos.x()
        y = pos.y()
        text = "x: {0}, y: {1}".format(x, y)
        self.ui.labelTracking.setText(text)   

И в Ui_Dialog включите self.tab.setMouseTracking(True). QMouseEvent.windowPos() используется вместо pos() для получения координат относительно окна, которое получило событие, в противном случае оно будет относиться к виджету вкладки при наведении на него курсора.

...