2016-04-08 4 views
2

QAbstractListModelから継承したモデルがあり、qmlで使用します。このモデルのプロパティの1つはパラメータであり、このモデルの要素タイプに固有のものです。これは、このクラスのパラメータであるTemperatureParam、DifferentialParamType、その他の3番目の要素です... qmlにオブジェクトを渡して、使用後にメモリが解放されるようにするにはどうすればよいですか?以下のコードは必要なときに機能しますが、安全ではないようです。オブジェクトをC++からqmlに送信します。空きメモリはどうですか?

のParamクラスはとても簡単です:

class QuickTemperatureParam : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(float param1 READ param1 WRITE setParam1) 
//... 
}; 

Modelクラス(ここで私はを求めているものです):

class SectionsModel : public QAbstractListModel 
{ 
//... 
QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override 
{ 
//... 
    int type = getType(idx); 
    if (type == 1) 
    { 
     auto p = new QuickTemperatureParam(idx); 
     p->deleteLater(); // This is all right or no? 
     return qVariantFromValue(p); 
    } 
    else if (type == 2) 
    //... 
} 
}; 

QMLこのような何か:

ListView { 
    model: sectionsModel 

    delegate: Rectangle { 
     color: model.statusColor 

     ItemDelegate { 
      text: model.title 
      highlighted: ListView.isCurrentItem 

      onPressed: 
       switch (model.type) 
       { 
       case SectionType.Temperature: 
        temperatureParam.openItem(model) 
        break; 
       case SectionType.Lighting: 
        lightingParam.open(model) 
        break; 
       } 
     } 
    } 
} 

Popup { 
    id: temperatureParam 

    function openItem(model) 
    { 
     var p = model.param 

     params.itemAt(0).range.from = params.itemAt(1).range.from = p.min 
     params.itemAt(0).range.to = params.itemAt(1).range.to = p.max 

     params.itemAt(0).range.setValues(p.dayMin, p.dayMax) 
     params.itemAt(1).range.setValues(p.nightMin, p.nightMax) 

     open() 
    } 
} 

答えて

3

よりますdocumentation

データがC++からQMLに転送されると、データの所有者は常にC++のままです。 この規則の例外は、明示的なC++メソッド呼び出しから返されたQObject です。この場合、 オブジェクトの所有権が明示的にC++のままになるように設定されていない限り、QML エンジンはオブジェクトの所有権を引き継ぎます QQmlEngine :: setObjectOwnership()とQQmlEngine :: CppOwnership が指定されています。

一般に、アプリケーションはオブジェクトの所有権を明示的に設定する必要はありません。 hereを読むことができるので、デフォルトでは、QMLによって作成されるオブジェクトはJavaScriptOwnershipです。

C++メソッド呼び出しから返されるオブジェクトもJavaScriptOwnershipに設定されますが、これはQ_INVOKABLEメソッドまたはスロットの明示的な呼び出しにのみ適用されます。

方法dataは、明示的なC++メソッドの呼び出しではありませんので、あなたは一般的に、そうsetObjectOwnership()

を呼び出すQQmlEngine::JavaScriptOwnershipにオブジェクトの所有権を設定することを検討する必要があります。

  • あなた場合QQmlEngine::CppOwnershipを使用しないでくださいQMLにオブジェクトを破棄させたい必要に応じて関連付けられたデータが削除されます(つまり、ガベージコレクタが値へのライブ参照が存在しなくなった後に)
  • QSharedPointerはおそらく動作しません。詳細情報はhereです。
+0

うわー、私はそれについて知らなかった。返信いただきありがとうございます。 しかし、私はsetObjectOwnershipを試してみましたが、それはdeleteLaterよりもずっと悪かったです。私がdeleteLaterを離れると、QQmlEngineと私のモデルが同じスレッドで作成されれば十分です。関数temperatureParam.openItem(QML)を終了した後、このオブジェクトは必要なくなりました。またはオブジェクトは以前に削除される可能性がありますか? – lirik90

+0

@ lirik90ありがとう!まあ、私は 'deleteLater'コード行を削除するとは言いませんでした。もしあなたが 'temperatureParam.openItem'の間に' data'が実行されたら(私は正しいのでしょうか?)、所有権を 'QQmlEngine:'に設定しない限り、 'p'は削除されないと思います。 :JavaScriptOwnership'。 – Tarod

関連する問題