QTextDocument не является визуальным элементом, но хранит информацию, отформатированную таким образом, что концепция clicked не имеет ничего общего с ним, но с виджетом.
В этом случае я буду использовать 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_())