我对 QWebView::createWindow() 以及如何处理创建新的浏览器窗口有一个严重的问题。
我按照文档(MyWebView)的说明对 QWebView 进行了子类化,并重新实现了它的 createWindow() 方法和 contextMenuEvent(QContextMenuEvent * event) 方法,以便我可以添加和更改我自己的菜单条目。
上下文菜单条目“打开链接”、“在新选项卡中打开链接”和“打开图像”都可以正常工作,如果选择了“打开链接”,则将所需的链接/图像打开到同一选项卡中,或者如果其中之一打开则打开新选项卡其余三个“打开...”条目被选中。此外,当单击要在新窗口中打开的网页时,它们将按预期在新选项卡中打开。
但是,我添加了一个名为“在新窗口中打开链接”的新菜单条目,但我终其一生都无法让它工作。它会打开全新的浏览器窗口,但不会加载单击的 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");
}
}
}
然后“打开图像”、“在新选项卡中打开链接”和“在新窗口中打开链接”功能(默认“打开链接”工作得很好,所以我不需要重新实现那个)
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() 之外,我很乐意听到。谢谢!