我创建了一个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快速组件略有不同。
答案 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)
您不能将QQuickView
与ApplicationWindow
课程一起使用。不仅没有调用你的析构函数,你的构造函数也不是 ,因为加载不会成功。
以下代码在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
然后程序中止,因此不会调用析构函数。