Обработка разных ссылок по-разному в 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.