2

QTで定義されたQAbstractListModelベースのクラスがあり、QMLでこのモデルをGridViewに設定しました。それは完璧に機能します。モデルのデータを変更すると、リセット関数が呼び出され、GridView に更新されたデータが表示されます。しかし、完全なモデル データを変更するときがあります (つまり、データだけでなく、そのカウントも変更されます)。この場合、データをリセットすると、GridView は更新されたモデルを表示しません。また、モデルの新しいオブジェクトを作成しようとし、GridView モデルを変更しましたが、まだ効果がありません。

基本的なコード スニペットを次に示します。

// DataEngine.h
class DataEngine : public QAbstractListModel
{
    Q_OBJECT
public:
    .....
public: // Overrides
    int rowCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
}
// main.c
DataEngine *data = new DataEngine();
view.rootContext()->setContextProperty("DataModel", data)

// QML File
GridView {
.....
id: view
model: DataModel
.....
}

// After completely changing data (i.e earlier it has 256 rows, now it has say 0 row)
// I tried
view.rootContext()->setContextProperty("NewDataModel", data)
// QML Code
view.model = NewDataModel     // No effect.

データは変更されているようですが、GridView は新しいデータで更新されていません。

どんな助けでも大歓迎です。

よろしく、 ファルーク・アルシャド

4

2 に答える 2

3

データが変更されたことを基になる基本モデルに通知できていないのではないかと思います。子クラスで行う必要があることの詳細については、QAbstractItemModel のこのセクションを参照してください。特に、次の文はかなりのことを言っています。

これらの関数を実装するときは、モデルの寸法の変更が発生する前と後の両方で、接続されたビューに通知することが重要です。

データを減らして削除する場合はremoveRowsの実装を提供する必要があり、データを増やす場合はinsertRowsの実装を提供する必要があります。私の場合、自分のソースからのデータを持っていたので、そのデータを削除し、rowIndex を 0 として返していましたが、うまくいきませんでした。return true 内で beginRemoveRows と endRemoveRows を使用して removeRows の空の実装を追加し、このシグナルを発行しました。このシグナルにより、ビューはデータ数が変更されたことを認識し、rowCount 関数を呼び出して 0 を返しました。

于 2012-09-04T12:15:57.637 に答える
1

問題は解決しました。Wes Hardaker によって提供されたポインターは完璧であり、彼の Answer を編集して詳細を既に述べました。ここで私はコードを共有しています。モデルのサブクラスは、removeRows / insertRows の実装を提供する必要があります。これらの関数を使用すると、beginRemoveRows / endRemoveRows & beginInsertRows / endInsertRows を呼び出すと、ビューはデータ数が変更されたことを認識し、ビューは更新されたカウントを提供できる rowCount 関数を呼び出します。質問に記載されているコードを展開します。

// When changing the data, following two lines are being called on a 
// button press from the QML.
// Invokable method

delete this->data;         // As mentioned in question data is DataEngine object.
this->data = NULL;

// DataEngine destructor
DataEngine::~DataEngine()
{
    // Remove all rows from the data model so that
    // the model view knows the data is changed
    removeAllRows();
}
void DataEngine::removeAllRows()
{
    removeRows(0, this->getBufferSize(), this->index(0,0));
}
bool DataEngine::removeRows(int row, int count, const QModelIndex &parent)
{
    beginRemoveRows(QModelIndex(), row, row + count - 1);
    // You can delete your actual data here as well, I was deleting it in the 
    // destructor of DataEngine.
    endRemoveRows();
    return true;
}
于 2012-09-04T19:17:55.767 に答える