QTreeView与sqlalchemy
我想做一个QTreeView,显示我用sqlalchemy得到的一些数据。有大约1000-10.000行显示。我认为使用模型比使用更简单的QTreeWidget更好,因为我认为将模型连接到sqlalchemy会相对容易,因为我认为这是经常进行的操作。显然它不是......我无法找到这个好例子。QTreeView与sqlalchemy
我看了一下QStandardItemModel的文档,据我了解,我必须为每个值创建一个QStandardItem。凭借数千行九列,我认为这将会非常缓慢。
我以前曾在wxpython中使用过ObjectListView,并希望Qt中的treeview功能类似,所以当我发现这将是多么复杂时,您可以想象我的失望:P。
所以我的问题:
- 是否有SQLAlchemy的连接QTreeView则的方法吗?
- 如何在我的树形视图中使用sqlaclhemy返回的项目? (如通过ObjectListView完成)
正如你看到的我是很新的模型和视图(QT),所以任何回答,解释,链接,有用的提示或whatsever有话要说这是非常欢迎!
好消息 - 你做不是需要创建任何QStandardItems。 Qt视图类永远不会调用数据类的任何方法,因此您的数据可以以任何您想要的方式存储。他们只调用模型类的方法(不像在Ruby on Rails中,每个数据类都被认为是一个模型,在Qt中,“model”指的是整个数据类的集合)。
我建议子类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();
}
};
谢谢,这澄清了很多! – BrtH
我已经完成了这个工作,并且我已经发现QAbstractItemModel在Python中非常慢。我采用了相同的标准Qt树视图示例并将其转换为Python,并且性能没有QStandardItemModel甚至QTreeWidget那么好,即使使用了10k +项目,我也没有做任何事情。 –
@EricHulser - 嗯。无法评论,只用C++完成,但这并不是一个好兆头......如果这不可行,你最终会用到什么? –