Qt QWebEngine - работа с привязками HTML <a>
Добрый день, сообщество stackoverflow. Есть нетривиальный вопрос.
Для отображения веб-контента мы используем ActiveX. Мы решили перейти на QWebEngine, но столкнулись с проблемами:
ActiveX позволяет нам:
- сохранить привязки HTML в QAxObject
- слушать события щелчка якорей
- извлекать и изменять свойства якорей ("id", "href")
Пример кода:
CComPtr<IHTMLDocument2> m_htmlDocument;
CComPtr<IHTMLElementCollection> htmlAnchorsCollection;
QSignalMapper m_anchorClickMapper
QList<QPointer<QAxObject>> m_anchors;
...
//Connects the mapping of anchors and the AnchorClicked() signal. Id will be a param
connect(&m_anchorClickMapper, SIGNAL(mapped(QString)), SIGNAL(AnchorClicked(QString)));
...
m_htmlDocument->get_anchors(&htmlAnchorsCollection);
...
for (auto i = 0; i < anchor_count; ++i)
{
CComPtr<IDispatch> disp;
if (SUCCEEDED(htmlAnchorsCollection->item(CComVariant(i), CComVariant(0), &disp)))
{
auto anchor = new QAxObject(disp, this);
auto id = anchor->property("id").toString();
//For anchors with an id, listen to click() events and emit AnchorClicked()
if (!id.isEmpty())
{
m_anchorClickMapper.connect(anchor, SIGNAL(onclick()), SLOT(map()));
m_anchorClickMapper.setMapping(anchor, id);
m_anchors << anchor;
}
}
}
работа с якорями
for (auto & anchor : m_anchors)
{
auto id = anchor->property("id").toString();
if (id.startsWith("cta"))
{
auto href = anchor->property("href").toString();
// adding additional params to href
anchor->setProperty("href", href);
}
}
Якорь HTML выглядит так:
<a class="cta cta-link" id="{{cta_id}}" onclick="window.close()" href="https://www.google.com/" target="_blank">English CTA1</a>
Можно ли сделать что-то подобное с QWebEngine? Ключевые требования:
- Поймать события щелчка якорей
- Понять, какой якорь был нажат (в зависимости от имени мы можем запустить внутреннюю логику C++)
- Есть возможность обновлять якоря href
Буду признателен за любые мысли / идеи
1 ответ
Решение
Ответ является:
- Использовать
QWebEnginePage::runJavaScript()
если вам не нужно слушать события щелчка. - Для прослушивания событий щелчка - используйте
QWebChanell