经过多次咒骂和诅咒之后,我设法得到了一个例子来做我想要的,通常是开放的普通链接,并打开任何在外部浏览器中请求新窗口的内容;然而,有一个障碍.它泄漏了内存,因为我制作了一堆额外的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:在默认浏览器中打开与目标的链接,不会泄漏内存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)