2012-09-04 40 views
2

我有一个基于QAbstractListModel的类在QT和QML中定义我已将此模型设置为GridView。它工作完美。如果我更改模型中的数据,我会调用重置函数,并且GridView会显示更新后的数据。但在我改变完整的模型数据时(即不仅仅是数据的变化,还有它的计数变化)。在这种情况下,当我重置数据时,GridView不显示更新后的模型。我也尝试创建我的模型的一个新对象,并改变了GridView模型,但仍然没有效果。在运行时更改QML 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控件不与新的数据更新。

任何帮助表示赞赏。

最好的问候, 法鲁克艾尔沙德

回答

3

我怀疑你没有通知您的数据已修改了底层基础模型。请参阅QAbstractItemModel的this section以了解有关您的子类中需要执行的操作的详细信息。特别是,下面的句子说颇有几分:

在实现这些功能,它们发生时通知有关双方之前和后改变模型的维度任何连接的意见是很重要的:

如果你是消除减少的数据,那么你必须提供removeRows的实现,如果你正在增加数据,那么你必须提供insertRows的实现。在我的情况下,因为我有自己的数据源,所以我刚刚删除了这些数据,并将rowIndex作为0返回,结果无效。我刚刚添加了一个空的removeRows实现,用beginRemoveRows & endRemoveRows里面返回true,并发出这个信号。有了这个信号,我的视图知道数据计数已更改,所以它已经调用了rowCount函数,我已经返回0.

+0

感谢科尔添加额外的信息;更多的信息总是更好! –

1

问题已解决。 Wes Hardaker提供的指针非常完美,我已经通过编辑他的答案提到了细节。这里是我分享的代码。你的模型子类必须提供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; 
}