Создать пользовательское событие при нажатии на ссылку в QTextDocument - PullRequest
2 голосов
/ 29 января 2020

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

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

1 Ответ

4 голосов
/ 29 января 2020

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_())
...