【问题标题】:How to properly close QWebView without result in memory leak?如何正确关闭 QWebView 而不会导致内存泄漏?
【发布时间】:2016-01-29 17:29:48
【问题描述】:

我有一个自定义的QWebView 声明为:

class browserControl : public QWebView {
  Q_OBJECT
 public:
         explicit browserControl(QWidget *parent = 0);
         ~browserControl();
  // ....
}

它是MainWindow 类的成员(与Qt 在GUI 应用程序上生成的相同)我在按下按钮时调用show()。所以它在一个新窗口中打开网络浏览器但是当我关闭主窗口我们的网络浏览器时,我得到了一堆内存泄漏(它可能与每次运行不同,取决于打开的页面,我猜)喜欢(如果我关闭主窗口然后关闭浏览器)

泄漏:24 个缓存资源

泄漏:231 WebCoreNode

或者如果我关闭浏览器然后是主窗口:

泄漏:1 个 XMLHttpRequest

泄漏:49 CachedResource

泄漏:2528 WebCoreNode

我该如何解决这个问题?

编辑

询问的构造函数代码:

browserControl::browserControl(QWidget *parent)
    : QWebView(parent)
{
}

browserControl::~browserControl()
{
}

【问题讨论】:

  • 你能发布构造函数代码吗?以及如何构造这个对象?
  • @MehrdadMomeny:查看编辑。我把构造函数代码。该对象是主窗口类的成员(由 Qt 在 GUI 应用程序中生成的)。我没有设置父母。也许这就是原因?
  • 如果你没有设置父级,也没有手动删除小部件,你希望它如何被删除?
  • @MehrdadMomeny:当我将父级设置为主窗口时,浏览器会嵌入到主窗口的窗体中,位于同一窗体的选项卡控件之上。我应该使用哪个父级或如何手动删除它?
  • 检查我的答案中的第二个选项,您不需要设置父项。

标签: c++ windows qt memory-leaks qwebview


【解决方案1】:

你有两个选择:

  1. 您可以将作为 QApplication 对象的直接或间接子级的父 QObject 传递给小部件的构造函数。由于 qobject 的析构函数会删除其子级,最终您的小部件将被删除。

  2. 第二个选项是您在您的小部件上设置Qt::WA_DeleteOnClose 属性,这样当您关闭小部件本身时它将被删除,并且不会等待应用程序关闭。这样做:widget->setAttribute(Qt::WA_DeleteOnClose);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多