Обработка разных ссылок по-разному в QTextBrowser

Я пытаюсь настроить QTextBrowser, где большинство гиперссылок работают нормально, но гиперссылки, начинающиеся с произвольного префикса, вместо этого вызовут функцию.

@ three-pineapples предоставили здесь несколько замечательных инструкций о том, как добиться последнего поведения, обнаружив префикс в URL-адресе и вызвав метод на основе этого URL-адреса.

Проблема в том, чтобы это работало, QTextBrowser setOpenLinks() метод должен быть установлен False так что QTextBrowser будет излучать anchorClicked() сигнал. В противном случае ссылки с префиксом обрабатываются Qt автоматически и не имеют собственного поведения. Но если я установлю setOpenLinks() False нормальные ссылки теперь не работают должным образом.

Любые идеи, как повторно реализовать обработку ссылок вручную в среде с setOpenLinks() задавать False или получить пользовательское поведение для ссылок с префиксом в среде, где оно установлено True? Спасибо за вашу помощь!

1 ответ

Решение

Способ 1: полный контроль (но дублирование кода Qt)

Если вы хотите получить полный контроль, отключите механизм обработки ссылок Qt, используя setOpenLinks(false) и полностью реализовать обработку ссылок на основе реализации Qt (QTextBrowserPrivate::_q_activateAnchor) для обычных ссылок:

bool isFileScheme =
        url.scheme() == QLatin1String("file")
#if defined(Q_OS_ANDROID)
        || url.scheme() == QLatin1String("assets")
#endif
        || url.scheme() == QLatin1String("qrc");
if ((openExternalLinks && !isFileScheme && !url.isRelative())
    || (url.isRelative() && !currentURL.isRelative() && !isFileScheme)) {
    QDesktopServices::openUrl(url);
    return;
}

q->setSource(url);

Итак, откройте URL с помощью QTextBrowser::setSource или откройте его снаружи, используя QDesktopServices::openUrl,

Метод 2: комплексный подход

Включить механизм обработки ссылок Qt используя setOpenLinks(true), anchorClicked будет выдаваться в общем случае, если ссылка имеет файловую схему или, точнее, при невыполнении следующего условия:

if ((openExternalLinks && !isFileScheme && !url.isRelative())
    || (url.isRelative() && !currentURL.isRelative() && !isFileScheme)) 

Если вы не звоните setSource или измените содержание QTextDocument, источник будет автоматически настроен на клик по URL.

Другие вопросы по тегам