如何在 QTabWidget 中启用鼠标跟踪移动
How to enable mouse tracking on movement in QTabWidget
我在 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_())
如果您在 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()
来获取相对于接收事件的 window 的坐标,否则当鼠标悬停在它上面时它将相对于选项卡小部件。
我在 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_())
如果您在 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()
来获取相对于接收事件的 window 的坐标,否则当鼠标悬停在它上面时它将相对于选项卡小部件。