Qt模型/视图:如何正确处理底层数据



我看了大量的视频,花了很多时间阅读关于模型的论文,如何使用它们,总的想法很清楚。然而,我仍然没有得到一些真正让我慢下来的东西。

我意识到模型只能作为视图和数据之间的接口。然而,当我查看示例代码时,大多数时候,某种数据结构被发送到模型,模型中的所有函数都使用该内部模型数据结构来做所需的事情:评估标头,行计数等。这样的构造函数的例子(在这种情况下,内部模型QList是addressBook):

AddressbookModel::AddressbookModel(const QString& addresses,
  QObject *parent): QAbstractTableModel(parent)
{
  QStringList records = addresses.split(’n’);
  QStringList line;
  foreach(QString record, records)
  addressBook.append(splitCSVLine(record));
}

这看起来还行,但是当我试图考虑修改程序中其他地方的底层数据时,当某种模型"附加"到该数据结构时,就会变得非常混乱。

例如,让我们看一下学习材料中的示例代码:

    // addressbook/main.cpp
#include <QtGui>
#include "addressbookmodel.h"
int main( int argc, char* argv[] )
{
  QApplication app( argc, argv );
  QFile file("addressbook.csv");
  if ( !file.open(QIODevice::ReadOnly|QIODevice::Text) )
    return 1;
  QString addresses = QString::fromUtf8(file.readAll());
  AddressbookModel model(addresses);
  QTableView tableView;
  tableView.setModel(&model);
  tableView.show();
  return app.exec();
}

这里,有一个静态变量addresses,然后发送给model。现在,用户可以看到并修改这些数据。但如果我想在项目的其他地方更多地使用这些数据呢?如果我向addresses插入新条目会怎样?我意识到模型不会看到这些变化,在这个例子中(以及在更多的例子中),底层数据结构甚至不是作为指针发送的。

所以我的问题是:当我将有来自"幕后"的新数据时,如何正确地管理数据——而不仅仅是来自模型?我是否应该只在模型类中使用数据管理(实现所需的功能等)?我是否应该以某种方式只传递数据指针给模型?当我想到使用代理模型进行过滤时,一切都变得更加棘手,因为它们也以自己的方式"处理"数据。也许我错过了这个架构的一些重要的东西,但它真的让我停在这里。

使用Qts数据模型可能会非常令人困惑。你需要关注你自己的大部分"更新"。例如,如果您在QAbstractItemModel::setData的重载中更改了模型数据,您将不得不自己发出QAbstractItemModel::dataChanged。插入、删除或移动条目也是如此。如果你有时间,你应该阅读SaZ发布的链接,但是对于一些关于在哪个重载中发出什么的快速信息,你可以查看QAbstractItemModel Documentation。

对于"幕后"数据的修改:最佳实践是更改模型上的数据,即调用QAbstractItemModel::setData来更改一些数据。但是,由于这个函数被设计为以"可显示格式"获取数据,因此最好创建自己的函数。在这些函数中,您需要将更改"通知"模型。这样所有的视图都会正确更新。

例如,如果你的"AddressRecord"有name属性:

void AddressbookModel::changeName(QModelIndex addressIndex, QString name) {
    //For this example I assume you are using a simple list model with only one column
    //The addressIndex´s column is always 0 in this case, and the parent invalid
    addressBook[addressIndex.row()].setName(name);
    emit dataChanged(addressIndex, addressIndex);
}
如您所见,您将不得不以某种方式使用QModelIndex类,它表示模型中条目的位置。

我希望我能帮助至少一点,但Qts模型视图框架可以非常棘手,特别是如果你必须添加,删除,移动或排序你的数据。但是要想更深入地了解它,恐怕你只能自己尝试一下了!

相关内容

  • 没有找到相关文章

最新更新