1

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 は QtQuick.Controls ではなく Sailfish Silica を使用しており、ウィンドウは正常に表示されることに注意してください。これらのコンポーネントは、標準の qt クイック コンポーネントとは多少異なる必要があります。

4

4 に答える 4

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();
}
于 2013-09-03T20:58:09.697 に答える
1

私のコードには何も問題はありません。それはSDKの何かです。ショーのデバッグ

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

その後、プログラムは中止されるため、デストラクタは呼び出されません。

于 2013-09-08T08:12:31.427 に答える
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}
}
于 2013-09-04T18:44:18.430 に答える
1

ApplicationWindow をツアーして、明示的に destroy() メソッドを使用して、何が起こるかを確認することができます。

于 2013-09-04T16:06:04.937 に答える