我有一个严重的问题QWebView :: createWindow()以及如何处理创建新的浏览器窗口.
我按照docs(MyWebView)的说法对QWebView进行了细分,并重新实现了它的createWindow()方法以及它的contextMenuEvent(QContextMenuEvent*event)方法,以便我可以添加和更改自己的菜单条目.
上下文菜单条目"打开链接","在新标签中打开链接"和"打开图像"都可以正常工作,如果选择"打开链接",则打开所需的链接/图像到相同的选项卡,如果其中一个,则打开到新选项卡中其他三个"Open ..."条目被选中.此外,当单击要在新窗口中打开的网页时,它们将按预期在新选项卡中打开.
但是,我添加了一个名为"在新窗口中打开链接"的新菜单条目,因为我的生活无法使其正常工作.它会打开全新的浏览器窗口,但不会加载点击的网址.更糟糕的是,如果我手动将一些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()之外,我很乐意听到.谢谢!