2

当我们单击 QTextDocument 中添加到 QTextEdit 中的链接时,有没有一种方法可以生成自定义事件。我目前能够使用 QTextCursor 类的 insertHtml() 函数创建链接,但该链接不可点击。

如果您知道如何在单击 QTextDocument 中的链接时生成自定义事件,请分享。谢谢

4

1 回答 1

4

QTextDocument 不是可视元素,而是存储格式化的信息,因此单击的概念与它无关,而是与小部件有关。

在这种情况下,我将以 QTextEdit 为例,您必须重写 mousePressEvent 方法并使用 anchorAt 方法来知道是否有锚点(url):

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class TextEdit(QtWidgets.QTextEdit):
    clicked = QtCore.pyqtSignal(QtCore.QUrl)

    def mousePressEvent(self, event):
        anchor = self.anchorAt(event.pos())
        if anchor:
            self.clicked.emit(QtCore.QUrl(anchor))
        super().mousePressEvent(event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = TextEdit()
    w.append('Welcome to <a href="https://stackoverflow.com" >StackOverflow</a>!!!')

    def on_clicked(url):
        QtGui.QDesktopServices.openUrl(url)

    w.clicked.connect(on_clicked)
    w.show()
    sys.exit(app.exec_())

虽然同样的功能已经有 QTextBrowser:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QTextBrowser()
    w.append('Welcome to <a href="https://stackoverflow.com" >StackOverflow</a>!!!')

    def on_clicked(url):
        QtGui.QDesktopServices.openUrl(url)

    w.anchorClicked.connect(on_clicked)
    w.show()
    sys.exit(app.exec_())
于 2020-01-29T17:27:08.840 回答