Python QTreeView与sqlalchemy
我想制作一个QTreeView,显示我通过sqlalchemy获得的一些数据。大约有1000-10000行要显示。我认为在这里使用模型比使用更简单的QTreeWidget更好,因为我认为将模型连接到sqlalchemy相对容易,因为我假设这是经常做的事情。显然不是。。。我找不到这方面的好例子 我查看了QStandardItemModel的文档,据我所知,我必须为每个值创建一个QStandardItem。数千行乘以九列,我认为这将非常缓慢。Python QTreeView与sqlalchemy,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,我想制作一个QTreeView,显示我通过sqlalchemy获得的一些数据。大约有1000-10000行要显示。我认为在这里使用模型比使用更简单的QTreeWidget更好,因为我认为将模型连接到sqlalchemy相对容易,因为我假设这是经常做的事情。显然不是。。。我找不到这方面的好例子 我查看了QStandardItemModel的文档,据我所知,我必须为每个值创建一个QStandardItem。数千行乘以九列,我认为这将非常缓慢。 我以前在wxpython中工作过,希望Qt中的treev
我以前在wxpython中工作过,希望Qt中的treeview也能起到类似的作用,所以当我发现这将是多么复杂时,你可以想象我的失望:P 所以我的问题是:
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();
}
};
模板类ListModel:公共QAbstractItemModel
{
受保护的:
//这是我存储数据的地方-它只是一个通用列表!
//是否尝试使用SQL结果?
QList-mData;
公众:
ListModel():mData(){}
int columnCount(常量QModelIndex和index)常量
{
//您可能需要一个不同的号码:
返回1;
}
QVariant数据(常量QModelIndex和索引,int角色)常量
{
if(index.isValid()&&role==Qt::DisplayRole&&index.column()==0)
{
if(T*T=(T*)index.internalPointer())
{
//基于列号的内容:
返回t->data[index.column()];
}
}
返回QVariant();
}
QVariant headerData(int段,Qt::定向,int角色)常量
{
如果(方向==Qt::水平和角色==Qt::显示角色和部分==0)
{
//基于列号的内容:
返回“标题文本”;
}
返回QVariant();
}
QModelIndex索引(int行、int列、常量QModelIndex&parent)常量
{
//如果您有分层模型,请对此进行调整:
return(parent.isValid())?QModelIndex():createIndex(行,列,(void*)mData[row]);
}
QModelIndex父项(常量QModelIndex和子项)常量
{
//如果您有分层模型,请对此进行调整:
返回QModelIndex();
}
int行计数(常数QModelIndex和索引)常数
{
//如果您有分层模型,请对此进行调整:
返回(index.isValid())?0:mData.count();
}
};
谢谢,这说明了很多问题!我以前已经研究过这个问题,我发现QabstracteModel在Python中的速度非常慢。我采用了同样的标准QT树视图示例并将其翻译为Python,性能没有使用QStaleReTimeMod那么好,甚至只是QTreWiGeGET,甚至是10K+项,我也没有做任何花样。@ Eriululs-嗯。不能评论,只是在C++中做过,但这并不好。如果这不可行,您最终使用了什么?我通常(10个中的9个)使用QTreeWidget,这取决于您如何构造它以加载它,它可以很好地处理自己。如果我想在不止一种视图类型中使用它,我真的只会为某些东西创建自己的模型。那只是我的看法。