c – Qt:在默认浏览器中打开与目标的链接,不会泄漏内存

c – Qt:在默认浏览器中打开与目标的链接,不会泄漏内存,第1张

概述通过互联网搜索,我遇到了很多方法,主要是非功能性,非特定功能或部分功能,可以使用QWebView和打开URL进行各种 *** 作. 经过多次咒骂和诅咒之后,我设法得到了一个例子来做我想要的,通常是开放的普通链接,并打开任何在外部浏览器中请求新窗口的内容;然而,有一个障碍.它泄漏内存,因为我制作了一堆额外的WebView,直到进程退出时才清理它们.如何在不泄漏记忆的情况下做到这一点? 请提前原谅我对Qt的 通过互联网搜索,我遇到了很多方法,主要是非功能性,非特定功能或部分功能,可以使用QWebVIEw和打开URL进行各种 *** 作.

经过多次咒骂和诅咒之后,我设法得到了一个例子来做我想要的,通常是开放的普通链接,并打开任何在外部浏览器中请求新窗口的内容;然而,有一个障碍.它泄漏了内存,因为我制作了一堆额外的WebVIEw,直到进程退出时才清理它们.如何在不泄漏记忆的情况下做到这一点?

请提前原谅我对Qt的二年级理解.在这一点上我只用了几个小时.

SSCCE:

test.hpp

#include <QMainWindow>#include <QWebVIEw>class Window : public QMainWindow {  Q_OBJECTpublic:  Window();private:  QWebVIEw* m_web;private slots:};class WebPage : public QWebPage {  Q_OBJECTpublic:    bool acceptNavigationRequest(QWebFrame *frame,const qnetworkrequest &request,NavigationType type);};class WebVIEw : public QWebVIEw {  Q_OBJECTpublic:  QWebVIEw* createWindow(QWebPage::WebWindowType type);};

TEST.CPP

#include <QApplication>#include <qgridLayout>#include <qnetworkrequest>#include <QDesktopServices>#include "test.hpp"Window::Window() :    QMainWindow() {  m_web = new WebVIEw;  m_web->setHTML("<div align=\"center\"><a href=\"http://www.Google.com/\">Same Window</a> <a href=\"http://www.Google.com/\" target=\"_blank\">New Window</a></div>");  setCentralWidget(m_web);}bool WebPage::acceptNavigationRequest(QWebFrame*,qnetworkrequest const& request,NavigationType) {  QDesktopServices::openUrl(request.url());  return false;}QWebVIEw* WebVIEw::createWindow(QWebPage::WebWindowType) {  auto res = new WebVIEw;  auto page = new WebPage;  res->setPage(page);  return res;}int main(int argc,char *argv[]) {  QApplication a(argc,argv);  Window w;  w.show();  return a.exec();}

test.pro

QT += core gui network webkitWidgets WidgetsTEMPLATE = appTARGET = testINCLUDEPATH += .CONfig += c++11# inputSOURCES += test.cppheaderS += test.hpp

编译和运行

qmake test.promake./test
解决方法 在extern浏览器中呈现页面后,视图似乎变得无用.
您可以使用deleteLater()安排ExternalWebVIEw删除:
#include <iostream>#include <QApplication>#include <qgridLayout>#include <qnetworkrequest>#include <QDesktopServices>#include <QEvent>#include <QMainWindow>#include <QWebVIEw>class ExternWebPage : public QWebPage {    //Q_OBJECT    public:    ExternWebPage(QObject* parent = 0)    :   QWebPage(parent)    {        std::cout << "ExternWebPage" << std::endl;    }    ~ExternWebPage() {        std::cout << "Destroy ExternWebPage" << std::endl;    }    virtual bool event(QEvent *e) {        static unsigned counter;        std::cout << ++counter << " ExternWebPage: " << e->type() << std::endl;        return QWebPage::event(e);    }    bool acceptNavigationRequest(QWebFrame *,NavigationType) {        QDesktopServices::openUrl(request.url());        return false;    }};class ExternWebVIEw : public QWebVIEw {    //Q_OBJECT    public:    ExternWebVIEw(QWidget* parent = 0)    :   QWebVIEw(parent)    {        std::cout << "ExternWebVIEw" << std::endl;    }    ~ExternWebVIEw() { std::cout << "Destroy ExternWebVIEw" << std::endl; }    virtual bool event(QEvent *e) {        static unsigned counter;        std::cout << ++counter << " ExternWebVIEw: " << e->type() << std::endl;        return QWebVIEw::event(e);    }};class InternalWebVIEw : public QWebVIEw {    //Q_OBJECT    public:    InternalWebVIEw(QWidget* parent = 0)    :   QWebVIEw(parent)    {}    QWebVIEw* createWindow(QWebPage::WebWindowType) {        auto res = new ExternWebVIEw();        res->setPage(new ExternWebPage(res));        res->deleteLater();        return res;    }};class Window : public QMainWindow {    //Q_OBJECT    public:    Window()    :   QMainWindow()    {        std::cout << "Window" << std::endl;        auto web = new InternalWebVIEw(this);        web->setHTML("<div align=\"center\"><a href=\"http://www.Google.com/\">Same Window</a> <a href=\"http://www.Google.com/\" target=\"_blank\">New Window</a></div>");        setCentralWidget(web);    }    ~Window() { std::cout << "Destroy Window" << std::endl; }};int main(int argc,argv);  Window w;  w.show();  return a.exec();}

测试没有删除:

WindowExternWebVIEw1 ExternWebVIEw: 68ExternWebPage2 ExternWebVIEw: 743 ExternWebVIEw: 751 ExternWebPage: 432 ExternWebPage: 433 ExternWebPage: 434 ExternWebPage: 435 ExternWebPage: 43Destroy Window

稍后删除测试:

ExternWebVIEw1 ExternWebVIEw: 68ExternWebPage2 ExternWebVIEw: 743 ExternWebVIEw: 754 ExternWebVIEw: 52Destroy ExternWebVIEwDestroy ExternWebPageDestroy Window
总结

以上是内存溢出为你收集整理的c – Qt:在默认浏览器中打开与目标的链接,不会泄漏内存全部内容,希望文章能够帮你解决c – Qt:在默认浏览器中打开与目标的链接,不会泄漏内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存