C ++类型的析构函数未在QML中调用

时间:2013-09-03 16:50:09

标签: c++ qt qml destructor qt5

我创建了一个Sailfish应用程序(使用最新的Sailfish SDK)。我有一个将C ++对象暴露给QML的问题。它继承了QSettings,

class Settings : public QSettings
{
    Q_OBJECT
    /**/
public:
    explicit Settings() : QSettings("Marcin Mielniczuk", "BigText") {}
    ~Settings() { qDebug() << "Dying"; }

    /**/
};

我注意到根本没有调用析构函数。 (没有析构函数输出)

我创建了这样的对象:

import QtQuick 2.0
import Sailfish.Silica 1.0
import BigText 1.0
import "pages"

ApplicationWindow
{
    initialPage: MainPage { }
    Settings {id: settings}
}

我的main.cpp是:

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QGuiApplication> app(Sailfish::createApplication(argc, argv));

    qmlRegisterType<Settings>("BigText", 1, 0, "Settings");

    QScopedPointer<QQuickView> view(Sailfish::createView("main.qml"));

    Sailfish::showView(view.data());

    return app->exec();
}

我做错了什么?

/ edit:未打印的文本不是实际问题 - 它只是问题的指示。析构函数中的QSettings sycing也不起作用。

EDIT2:请注意,ApplicationWindow我正在使用Sailfish Silica,而不是QtQuick.Controls,窗口显示正常。这些组件必须与库存qt快速组件略有不同。

4 个答案:

答案 0 :(得分:2)

你的逻辑没有任何内在错误。这是它的简化版本。我可以在本地运行它,并且每次关闭窗口并且应用程序终止时,在输出上始终会得到 Dying 消息。

如果你无法弄明白,我建议将这段代码转换成你正在做的事情直到它失败。

顺便说一句,这肯定只是你正在做的更大的事情片段,但至少就例子来说,这些范围的指针并没有做太多。

<强> main.qml

import QtQuick 2.0
import BigText 1.0

Item {
    width: 300; height: 300
    Settings {id: settings}
}

<强>的main.cpp

class Settings : public QSettings
{
    Q_OBJECT
    public:
    Settings() : QSettings("Marcin Mielniczuk", "BigText") {}
    ~Settings() { qDebug() << "Dying"; }

};

int main(int argc, char *argv[])
{
    QScopedPointer<QGuiApplication> app(new QGuiApplication(argc, argv));
    qmlRegisterType<Settings>("BigText", 1, 0, "Settings");
    QScopedPointer<QQuickView> view(new QQuickView());
    view->setSource(QUrl::fromLocalFile("main.qml"));
    view->show();
    return app->exec();
}

答案 1 :(得分:1)

您可以尝试使用put和id来浏览ApplicationWindow并在某个时候显式使用destroy()方法,看看会发生什么。

答案 2 :(得分:1)

您不能将QQuickViewApplicationWindow课程一起使用。不仅没有调用你的析构函数,你的构造函数也不是 ,因为加载不会成功。

以下代码在Qt 5.1.1下运行正常。在OS X 10.8和Windows 7上进行了测试。

<强> main.qrc

<RCC>
  <qresource prefix="/">
    <file>main.qml</file>
  </qresource>
</RCC>

<强> main.pro

QT       += core gui qml quick
TARGET = qml-appwin-end-18597527
TEMPLATE = app
SOURCES += main.cpp
OTHER_FILES += main.qml
RESOURCES += main.qrc

<强>的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSettings>
#include <QQuickWindow>
#include <QtQml>
#include <QDebug>

class Settings : public QSettings
{
    Q_OBJECT
    public:
    Settings() : QSettings("Marcin Mielniczuk", "BigText") {}
    ~Settings() { qDebug() << "Dying"; }
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    qmlRegisterType<Settings>("BigText", 1, 0, "Settings");
    engine.load(QUrl("qrc:/main.qml"));
    QObject *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
    window->show();
    return app.exec();
}

#include "main.moc"

<强> main.qml

import QtQuick 2.0
import QtQuick.Controls 1.0
import BigText 1.0

ApplicationWindow {
    width: 300; height: 300
    Settings {id: settings}
}

答案 3 :(得分:1)

我的代码没有问题。它与SDK有关。调试显示

ASSERT: "QThread::currentThread() == QCoreApplication::instance()->thread()" in file debugger/qqmldebugserver.cpp, line 576

然后程序中止,因此不会调用析构函数。