2

我想制作一个 QTreeView 来显示我使用 sqlalchemy 获得的一些数据。大约有 1000-10.000 行要显示。我认为在这里使用模型比使用更简单的 QTreeWidget 更好,因为我认为将模型连接到 sqlalchemy 会相对容易,因为我认为这是经常做的事情。显然不是……我找不到这方面的好例子。

我查看了 QStandardItemModel 的文档,据我了解,我必须为每个值创建一个 QStandardItem。有数千行乘以九列,我认为这将非常缓慢。
我之前在 wxpython 中使用过ObjectListView,并希望 Qt 中的树视图能够类似地工作,所以当我发现这将是多么复杂时,你可以想象我的失望:P。

所以我的问题:

  1. 有没有办法将 sqlalchemy 连接到 QTreeView?
  2. 如何在我的树视图中使用 sqlaclhemy 返回的项目?(就像 ObjectListView 所做的那样)

如您所见,我对模型和视图(以及 Qt)非常陌生,因此非常欢迎任何答案、解释、链接、有用的提示或任何对此有话要说的东西!

4

1 回答 1

2

好消息 - 您不需要创建任何 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();
    }
};
于 2012-08-26T00:49:30.627 回答