Создать пользовательское событие при нажатии на ссылку в QTextDocument

Есть ли способ, которым мы можем сгенерировать пользовательское событие, когда мы нажимаем ссылку внутри QTextDocument, которая добавляется в QTextEdit. В настоящее время я могу создать ссылку, используя функцию insertHtml() класса QTextCursor, но эта ссылка не активна.

Если вы знаете, как сгенерировать пользовательское событие при нажатии на ссылку в QTextDocument, пожалуйста, поделитесь. Спасибо


person Rod    schedule 29.01.2020    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person S. Nick    schedule 29.01.2020
comment
@eyllanesc да, это именно то, что я хочу. Но спасибо за ответ, очень помогает   -  person Rod    schedule 29.01.2020


Ответы (1)


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_())
person eyllanesc    schedule 29.01.2020