【发布时间】:2013-12-16 23:34:46
【问题描述】:
在 Internet 上搜索时,我发现了很多方法,主要是非功能性、非特定性或部分功能性,可以使用 QWebView 和打开 URL 来做各种事情。
经过大量的咒骂和诅咒,我设法得到一个例子来做我想做的事,即正常打开普通链接,并在外部浏览器中打开任何需要新窗口的东西;但是,有一个问题。它泄漏了内存,因为我做了一堆额外的WebViews,直到进程退出才被清理。如何在不泄漏内存的情况下做到这一点?
请提前原谅我对 Qt 的理解相当初级。目前我只使用了几个小时。
SSCCE:
test.hpp
#include <QMainWindow>
#include <QWebView>
class Window : public QMainWindow {
Q_OBJECT
public:
Window();
private:
QWebView* m_web;
private slots:
};
class WebPage : public QWebPage {
Q_OBJECT
public:
bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
};
class WebView : public QWebView {
Q_OBJECT
public:
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 widgets
TEMPLATE = app
TARGET = test
INCLUDEPATH += .
CONFIG += c++11
# Input
SOURCES += test.cpp
HEADERS += test.hpp
编译运行
qmake test.pro
make
./test
【问题讨论】:
-
你怎么知道有泄漏?
-
我不知道!我只是怀疑。我不太明白 Qt 是如何工作的,但我正在新建一个对象,然后将其丢弃。如果答案是“没有泄漏,别再傻了”。你可以以某种方式支持它,然后我会接受。
-
您是否尝试查找内存泄漏,例如使用 valgring(如果您在 linux 下)?
-
无论如何,m_web 不会被删除。你应该在构造函数中指定父级。
-
@Jepessen,我认为内存永远不会在 valgrind 中被标记为泄漏,因为 Qt 的库仍在保留它们。保留指向它们的指针,然后手动请求删除它们会向控制台发出非致命错误。我只是不太明白如何正确摆脱它们,或者是否有更好的方法可以完全避免问题。
标签: c++ qt memory-leaks qwebview