【发布时间】:2020-10-19 18:05:46
【问题描述】:
1。问题解释
当鼠标悬停在QTextEdit() 小部件中的可点击文本上时,我想让鼠标形状从I 光束变为指向手。感谢以下 StackOverflow 问题,我知道如何实现这一目标:
Clickable hyperlink in QTextEdit
不幸的是,改变光标形状的方式依赖于这个全局函数:
QApplication.setOverrideCursor(Qt.PointingHandCursor)
这可行,但是当您将鼠标移到其他小部件上时会产生意想不到的后果。改变鼠标形状的更简洁的方法是使用这个函数:
self.setCursor(Qt.PointingHandCursor)
self 是感兴趣的QWidget()。不幸的是,这对QTextEdit() 小部件没有影响。
2。简约示例
考虑以下简约的自包含示例代码:
import sys
from PyQt5.Qt import QDesktopServices, QUrl, QApplication, QColor, Qt
from PyQt5.QtWidgets import QTextEdit
class MyWidget(QTextEdit):
def __init__(self):
super().__init__()
self.setMouseTracking(True)
return
def mousePressEvent(self, e):
super().mousePressEvent(e)
self.anchor = self.anchorAt(e.pos())
if self.anchor:
self.setCursor(Qt.PointingHandCursor)
# QApplication.setOverrideCursor(Qt.PointingHandCursor)
return
def mouseReleaseEvent(self, e):
super().mouseReleaseEvent(e)
if self.anchor:
QDesktopServices.openUrl(QUrl(self.anchor))
self.setCursor(Qt.ArrowCursor)
# QApplication.setOverrideCursor(Qt.ArrowCursor)
self.anchor = None
return
def mouseMoveEvent(self, e) -> None:
super().mouseMoveEvent(e)
self.anchor = self.anchorAt(e.pos())
if self.anchor:
self.setCursor(Qt.PointingHandCursor)
# QApplication.setOverrideCursor(Qt.PointingHandCursor)
else:
self.setCursor(Qt.ArrowCursor)
# QApplication.setOverrideCursor(Qt.ArrowCursor)
return
if __name__== '__main__':
app = QApplication(sys.argv)
editor = MyWidget()
cursor = editor.textCursor()
fmt = cursor.charFormat()
fmt.setForeground(QColor('blue'))
address = 'http://example.com'
fmt.setAnchor(True)
fmt.setAnchorHref(address)
fmt.setToolTip(address)
cursor.insertText("This is a link", fmt)
editor.show()
app.exec_()
请稍微修改一下这个示例代码。你会注意到:
-
激活
QApplication.setOverrideCursor(Qt.PointingHandCursor)行即可。 -
使用清洁器
self.setCursor(Qt.PointingHandCursor)(让setOverrideCursor()被注释掉),什么也没有发生。
3。解决方案?
您知道让self.setCursor(Qt.PointingHandCursor) 在QTextEdit() 小部件上正常工作的方法吗?或者您知道实现相同目标的另一种方法 - 不使用 setOverrideCursor() 函数?
【问题讨论】:
标签: python python-3.x qt pyqt pyqt5