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()
}
}
うわー、私はそれについて知らなかった。返信いただきありがとうございます。 しかし、私はsetObjectOwnershipを試してみましたが、それはdeleteLaterよりもずっと悪かったです。私がdeleteLaterを離れると、QQmlEngineと私のモデルが同じスレッドで作成されれば十分です。関数temperatureParam.openItem(QML)を終了した後、このオブジェクトは必要なくなりました。またはオブジェクトは以前に削除される可能性がありますか? – lirik90
@ lirik90ありがとう!まあ、私は 'deleteLater'コード行を削除するとは言いませんでした。もしあなたが 'temperatureParam.openItem'の間に' data'が実行されたら(私は正しいのでしょうか?)、所有権を 'QQmlEngine:'に設定しない限り、 'p'は削除されないと思います。 :JavaScriptOwnership'。 – Tarod