Python setCursor()对QTextEdit小部件中的鼠标形状没有影响 1.问题解释

Python setCursor()对QTextEdit小部件中的鼠标形状没有影响 1.问题解释,python,python-3.x,qt,pyqt,pyqt5,Python,Python 3.x,Qt,Pyqt,Pyqt5,当鼠标悬停在QTextEdit()小部件中的可点击文本上时,我想使鼠标形状从I-光束变为指针。由于以下问题,我知道如何实现这一目标: 不幸的是,更改光标形状的方法依赖于此全局函数: QApplication.setOverrideCursor(Qt.PointingHandCursor) 这是可行的,但当您将鼠标移到其他小部件上时,会产生意想不到的后果。更改鼠标形状的更简洁方法是使用此功能: self.setCursor(Qt.PointingHandCursor) self是感兴趣的QW

当鼠标悬停在
QTextEdit()
小部件中的可点击文本上时,我想使鼠标形状从
I
-光束变为指针。由于以下问题,我知道如何实现这一目标:

不幸的是,更改光标形状的方法依赖于此全局函数:

QApplication.setOverrideCursor(Qt.PointingHandCursor)
这是可行的,但当您将鼠标移到其他小部件上时,会产生意想不到的后果。更改鼠标形状的更简洁方法是使用此功能:

self.setCursor(Qt.PointingHandCursor)
self
是感兴趣的
QWidget()
。不幸的是,这对
QTextEdit()
小部件没有影响

2.极简例子 考虑以下最简单的自包含示例代码:

导入系统 从PyQt5.Qt导入QDesktopServices、QUrl、QApplication、QColor、Qt 从PyQt5.QtWidgets导入QTextEdit 类MyWidget(QTextEdit): 定义初始化(自): super()。\uuuu init\uuuuu() self.setMouseTracking(True) 返回 def鼠标压力(自我,e): 超级鼠标压力事件(e) self.anchor=self.anchorAt(e.pos()) 如果self.anchor: self.setCursor(Qt.PointingHandCursor) #QApplication.setOverrideCursors(Qt.PointingHandCursor) 返回 def mouseReleaseEvent(自身,e): super().mouseReleaseEvent(e) 如果self.anchor: openUrl(QUrl(self.anchor)) self.setCursor(Qt.ArrowCursor) #QApplication.setOverrideCursor(Qt.ArrowCursor) self.anchor=None 返回 def mouseMoveEvent(自身,e)->无: super().mouseMoveEvent(e) self.anchor=self.anchorAt(e.pos()) 如果self.anchor: self.setCursor(Qt.PointingHandCursor) #QApplication.setOverrideCursors(Qt.PointingHandCursor) 其他: self.setCursor(Qt.ArrowCursor) #QApplication.setOverrideCursor(Qt.ArrowCursor) 返回 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) editor=MyWidget() cursor=editor.textCursor() fmt=cursor.charFormat() fmt.setForeground(QColor('blue')) 地址http://example.com' fmt.setAnchor(真) fmt.setAnchorHref(地址) fmt.setToolTip(地址) 插入文本(“这是一个链接”,fmt) 编者:show() app.exec() 请修改一下这个示例代码。你会注意到:

  • 激活行
    QApplication.setOverrideCursors(Qt.PointingHandCursor)
    ,它就会工作

  • 使用清理器
    self.setCursor(Qt.PointingHandCursor)
    (让
    setOverrideCursor()
    被注释掉),什么都不会发生

3.解决方案 您知道如何让
self.setCursor(Qt.PointingHandCursor)
QTextEdit()小部件上正常工作吗?或者您知道实现相同目标的另一种方法吗?不使用
setOverrideCursor()
函数?

关键是使用:

self.viewport().setCursor(Qt.PointingHandCursor)
而不是:

self.setCursor(Qt.PointingHandCursor)
我的灵感来自: