如何在 QTabWidget 选项卡上设置鼠标光标
How to set the mouse cursor on QTabWidget tabs
我正在处理一个我没有成功解决的简单问题。我正在使用 Python-3.6 和 PyQt5。
我想要的是当用户将鼠标放在非活动选项卡上方时更改鼠标光标(了解他可以点击在它上面更改活动选项卡)。而且这只在非活动选项卡上,而不是在其内容上(因为在 Qt Designer 中更改光标参数允许我这样做)。我花了几个小时在互联网上寻找这个答案,但没有找到我想要的。我想我必须处理样式表 属性,但我不知道该怎么做(这似乎与 QTabWidget::pane 有关)。有人可以帮我吗?
这是一个示例代码,其中 mouse-cursor 在整个选项卡上都发生了变化,而不仅仅是选项卡标题:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class Ui_Form(QtWidgets.QWidget):
def __init__(self, nb_courbes=1, nom_courbes='', parent=None):
super(Ui_Form, self).__init__(parent)
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(249, 169)
self.tabWidget = QtWidgets.QTabWidget(Form)
self.tabWidget.setGeometry(QtCore.QRect(40, 40, 127, 80))
self.tabWidget.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tabWidget.addTab(self.tab_2, "")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = Ui_Form()
form.show()
sys.exit(app.exec_())
我想要蓝色区域的普通光标(箭头),但在红色区域的非活动选项卡标题上更改鼠标光标。
您可以通过在 tab-bar:
上设置来更改 所有 选项卡的光标
self.tabWidget.tabBar().setCursor(QtCore.Qt.PointingHandCursor)
但是,要仅针对 非活动选项卡更改它,您必须使用事件过滤器来动态更改光标,如下所示:
def setupUi(self, Form):
...
self.tabWidget.tabBar().installEventFilter(self)
self.tabWidget.tabBar().setMouseTracking(True)
...
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.MouseMove and
source is self.tabWidget.tabBar()):
index = source.tabAt(event.pos())
if index >= 0 and index != source.currentIndex():
source.setCursor(QtCore.Qt.PointingHandCursor)
else:
source.setCursor(QtCore.Qt.ArrowCursor)
return super(Ui_Form, self).eventFilter(source, event)
(PS: Qt 不支持通过样式表更改光标)。
我正在处理一个我没有成功解决的简单问题。我正在使用 Python-3.6 和 PyQt5。
我想要的是当用户将鼠标放在非活动选项卡上方时更改鼠标光标(了解他可以点击在它上面更改活动选项卡)。而且这只在非活动选项卡上,而不是在其内容上(因为在 Qt Designer 中更改光标参数允许我这样做)。我花了几个小时在互联网上寻找这个答案,但没有找到我想要的。我想我必须处理样式表 属性,但我不知道该怎么做(这似乎与 QTabWidget::pane 有关)。有人可以帮我吗?
这是一个示例代码,其中 mouse-cursor 在整个选项卡上都发生了变化,而不仅仅是选项卡标题:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class Ui_Form(QtWidgets.QWidget):
def __init__(self, nb_courbes=1, nom_courbes='', parent=None):
super(Ui_Form, self).__init__(parent)
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(249, 169)
self.tabWidget = QtWidgets.QTabWidget(Form)
self.tabWidget.setGeometry(QtCore.QRect(40, 40, 127, 80))
self.tabWidget.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tabWidget.addTab(self.tab_2, "")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = Ui_Form()
form.show()
sys.exit(app.exec_())
我想要蓝色区域的普通光标(箭头),但在红色区域的非活动选项卡标题上更改鼠标光标。
您可以通过在 tab-bar:
上设置来更改 所有 选项卡的光标 self.tabWidget.tabBar().setCursor(QtCore.Qt.PointingHandCursor)
但是,要仅针对 非活动选项卡更改它,您必须使用事件过滤器来动态更改光标,如下所示:
def setupUi(self, Form):
...
self.tabWidget.tabBar().installEventFilter(self)
self.tabWidget.tabBar().setMouseTracking(True)
...
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.MouseMove and
source is self.tabWidget.tabBar()):
index = source.tabAt(event.pos())
if index >= 0 and index != source.currentIndex():
source.setCursor(QtCore.Qt.PointingHandCursor)
else:
source.setCursor(QtCore.Qt.ArrowCursor)
return super(Ui_Form, self).eventFilter(source, event)
(PS: Qt 不支持通过样式表更改光标)。