我想制作一个 QTreeView 来显示我通过 sqlalchemy 获得的一些数据。大约有 1000-10.000 行要显示。我认为在这里使用模型比使用更简单的 QTreeWidget 更好,因为我认为将模型连接到 sqlalchemy 会相对容易,因为我认为这是经常做的事情。显然不是......我找不到这方面的好例子。
我查看了 QStandardItemModel 的文档,据我了解,我必须为每个值创建一个 QStandardItem。对于数千行乘以九列,我认为这将非常慢。
我曾与ObjectListView合作过之前在 wxpython 中使用过,并希望 Qt 中的 TreeView 也能类似地工作,所以当我发现这将是多么复杂时,你可以想象我的失望:P。
所以我的问题:
- 有没有办法将 sqlalchemy 连接到 QTreeView?
- 如何在 TreeView 中使用 sqlaclhemy 返回的项目? (就像 ObjectListView 所做的那样)
如您所见,我对模型和 View (以及 Qt)非常陌生,因此非常欢迎任何答案、解释、链接、有用的提示或任何与此相关的内容!
最佳答案
好消息 - 您不需要创建任何 QStandardItems。 Qt View 类从不调用数据类上的任何方法,因此您的数据可以按照您想要的任何方式存储。它们仅调用模型类上的方法(与 Ruby on Rails 不同,其中每个数据类都被视为一个模型,而在 Qt 中,“模型”指的是数据类的整个集合)。
我建议子类化 QAbstractItemModel (请参阅“子类化”部分)并从那里开始工作。如果您只有一个平面列表,您甚至可以对其进行设置,以便您的自定义模型简单地包装从数据库返回的结果。
我用 C++ 做了这个 - 我花了很长时间才理解它,但是一旦我这样做了,它就很容易使用。这是我的只读模型的基本代码 - 您必须将其转换为 python,但希望它可以减轻您的痛苦!
注意:下面的代码假设您的数据是一个平面列表(没有父子关系)。如果不是这种情况,请查看this tutorial有关您必须进行哪些调整的详细信息。
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();
}
};
关于python - QTreeView 与 sqlalchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126225/