Как правильно использовать Qt QWebView :: createWindow (тип QWebPage :: WebWindowType)?

У меня есть серьезная проблема с QWebView :: createWindow () и как обрабатывать создание
новое окно браузера.

Я подклассифицировал QWebView, как сказано в docs (MyWebView), и переопределил его метод createWindow (), а также метод contextMenuEvent (событие QContextMenuEvent *), чтобы я мог добавлять и изменять свои собственные пункты меню.

Все пункты контекстного меню «Открыть ссылку», «Открыть ссылку в новой вкладке» и «Открыть изображение» работают отлично, и либо открывают нужную ссылку / изображение в той же вкладке, если выбран «Открыть ссылку», или в новой вкладке, если одна из остальные три оставшиеся записи «Open …» выбраны. Кроме того, при нажатии веб-страниц, которые нужно открыть в новом окне, они будут открываться в новой вкладке, как и ожидалось.

Тем не менее, я добавил новый пункт меню под названием «Открыть ссылку в новом окне», и я не могу заставить его работать. Он открывает совершенно новое окно браузера, но не загружает кликнувший URL. Еще хуже, если я вручную введу какой-нибудь адрес www в это новое окно браузера, а затем попытаюсь открыть новые вкладки, они откроются в старом окне !!!

Может кто-нибудь, пожалуйста, проверьте, что не так с моим кодом?

Сначала конструктор MyWebView:

MyWebView::MyWebView(QWidget * parent):
QWebView(parent),newWindow(false)
{
this->myPage = new MyWebPage;
this->setPage(this->myPage);

/* Just change text and nothing more ... */
this->action_openLinkInNewWindow = this->pageAction(QWebPage::OpenLinkInNewWindow);
if(this->action_openLinkInNewWindow) {
if(this->action_openLinkInNewWindow->isEnabled()) {
this->action_openLinkInNewWindow->setText("Open Link in New Window");
}
}
}

Затем функциональность «Открыть изображение», «Открыть ссылку в новой вкладке» и «Открыть ссылку в новом окне»
(по умолчанию «Open Link» работал просто отлично, поэтому мне не нужно было переопределять его)

void    MyWebView::openImage()
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << " called ...";
#endif
this->imageUrl = true;
this->newWindow = false;
this->createWindow(QWebPage::WebBrowserWindow);
}

void    MyWebView::openLinkInNewTab()
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << " called ...";
#endif
this->linkUrl = true;
this->newWindow = false;
this->createWindow(QWebPage::WebBrowserWindow);
}void    MyWebView::openLinkInNewWindow()
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << " called ...";
#endif
this->linkUrl = true;
this->newWindow = true;
this->createWindow(QWebPage::WebBrowserWindow);
}

Затем мой переопределенный contextMenuEvent ()

void MyWebView::contextMenuEvent(QContextMenuEvent * event)
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << " called ...";
#endif

this->rel_pos = event->pos();
QWebHitTestResult r = page()->mainFrame()->hitTestContent(event->pos());

QMenu menu(this);
if (!r.linkUrl().isEmpty()) {
menu.addAction(pageAction(QWebPage::OpenLink));
menu.addAction(tr("Open Link in New Tab"), this, SLOT(openLinkInNewTab()));
menu.addAction(tr("Open Link in New Window"),this,SLOT(openLinkInNewWindow()));

menu.addAction(pageAction(QWebPage::DownloadLinkToDisk));
menu.addAction(pageAction(QWebPage::CopyLinkToClipboard));
menu.addSeparator();
}

if(!r.imageUrl().isEmpty()) {
menu.addAction(tr("Open Image"),this,SLOT(openImage()));
menu.addAction(pageAction(QWebPage::DownloadImageToDisk));
menu.addAction(pageAction(QWebPage::CopyImageToClipboard));
menu.addAction(pageAction(QWebPage::CopyImageUrlToClipboard));
}

if(!r.linkUrl().isEmpty() || !r.imageUrl().isEmpty()) {
menu.exec(mapToGlobal(rel_pos));
return;
}
QWebView::contextMenuEvent(event);
}

И, наконец, проблематичный createWindow ()

QWebView*  MyWebView::createWindow(QWebPage::WebWindowType type)
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << " called ...";
#endif
switch(type) {
case    QWebPage::WebBrowserWindow:
{
QWebHitTestResult  hitTest = this->page()->mainFrame()->hitTestContent(rel_pos);
QUrl    url;
if(this->linkUrl) {
url = hitTest.linkUrl();
this->linkUrl = false;
}

if(this->imageUrl) {
url = hitTest.imageUrl();
this->imageUrl = false;
}

if(newWindow) {
/* This does not work!!!!*/
MainWindow *mw = new MainWindow;
mw ->show();
return mw->currentTab();
} else {
MyBrowser*  browser = new MyBrowser(url);
TabbedBrowser::getInstance()->newTab(browser,"Loading ...");
return browser->getwebView();
}
}
break;
}
return  QWebView::createWindow(type);
}

Если с моим кодом есть что-то еще, кроме createWindow (), я бы с удовольствием
слышать.
Спасибо!

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …