【问题标题】:setCursor() has no effect on mouse shape in QTextEdit widget [duplicate]setCursor() 对 QTextEdit 小部件中的鼠标形状没有影响[重复]
【发布时间】: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


    【解决方案1】:

    关键是要使用:

    self.viewport().setCursor(Qt.PointingHandCursor)
    

    代替:

    self.setCursor(Qt.PointingHandCursor)
    

    我的灵感来自:

    How to set cursor shape to '>' in a QTextEdit?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2010-09-15
      • 2016-03-08
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多