好消息 - 您不需要创建任何 QStandardItems。Qt 视图类从不调用数据类的任何方法,因此您的数据可以以任何您想要的方式存储。它们只调用模型类上的方法(不像在 Ruby on Rails 中,每个数据类都被视为一个模型,在 Qt 中,“模型”指的是整个数据类集合)。
我建议对QAbstractItemModel进行子类化(请参阅“子类化”部分)并从那里开始工作。如果您只有一个平面列表,您甚至可以设置它,以便您的自定义模型简单地包装从数据库返回的结果。
我是在 C++ 中完成的——花了我相当长的时间来理解它,但是一旦我这样做了,它就很容易使用。这是我的只读模型的基本代码 - 你必须将它翻译成 python,但希望它能让你免于痛苦!
注意:下面的代码假设您的数据是一个平面列表(没有父子关系)。如果不是这种情况,请查看本教程以获取有关您必须进行哪些调整的详细信息。
template <typename T> class ListModel : public QAbstractItemModel
{
protected:
//This is where I store my data - it's just a generic list!
//Try using your SQL result instead?
QList<T*> mData;
public:
ListModel(): mData() {}
int columnCount(const QModelIndex& index) const
{
//You'll probably want a different number here:
return 1;
}
QVariant data(const QModelIndex& index, int role) const
{
if(index.isValid() && role == Qt::DisplayRole && index.column() == 0)
{
if(T* t = (T*) index.internalPointer())
{
//Something, based on column number:
return t->data[index.column()];
}
}
return QVariant();
}
QVariant headerData(int section, Qt::Orientation orientation, int role) const
{
if(orientation == Qt::Horizontal && role == Qt::DisplayRole && section == 0)
{
//Something, based on column number:
return "header text";
}
return QVariant();
}
QModelIndex index(int row, int column, const QModelIndex& parent) const
{
//Tweak this if you have a hierarchical model:
return (parent.isValid())? QModelIndex() : createIndex(row, column, (void*) mData[row]);
}
QModelIndex parent(const QModelIndex& child) const
{
//Tweak this if you have a hierarchical model:
return QModelIndex();
}
int rowCount(const QModelIndex& index) const
{
//Tweak this if you have a hierarchical model:
return (index.isValid())? 0 : mData.count();
}
};