如何正确使用Qt QWebView :: createWindow(QWebPage :: WebWindowType类型)?

 pfm4191006 发布于 2023-02-13 12:34

我有一个严重的问题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()之外,我很乐意听到.谢谢!

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有