【问题标题】:How to enable mouse tracking on movement in QTabWidget如何在 QTabWidget 中启用鼠标移动跟踪
【发布时间】:2020-04-24 18:19:35
【问题描述】:

我在 PyQt5 中有一个 QApplication,它跟踪鼠标移动并使用 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_())

【问题讨论】:

    标签: python pyqt5 mouseevent qtwidgets


    【解决方案1】:

    如果您在 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() 来获取相对于接收事件的窗口的坐标,否则当鼠标悬停在它上面时,它将是相对于标签小部件的坐标。

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2013-08-21
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2022-10-26
      • 2022-06-22
      • 2012-10-15
      • 2021-02-06
      相关资源
      最近更新 更多