QTreeView与sqlalchemy

问题描述:

我想做一个QTreeView,显示我用sqlalchemy得到的一些数据。有大约1000-10.000行显示。我认为使用模型比使用更简单的QTreeWidget更好,因为我认为将模型连接到sqlalchemy会相对容易,因为我认为这是经常进行的操作。显然它不是......我无法找到这个好例子。QTreeView与sqlalchemy

我看了一下QStandardItemModel的文档,据我了解,我必须为每个值创建一个QStandardItem。凭借数千行九列,我认为这将会非常缓慢。
我以前曾在wxpython中使用过ObjectListView,并希望Qt中的treeview功能类似,所以当我发现这将是多么复杂时,您可以想象我的失望:P。

所以我的问题:

  1. 是否有SQLAlchemy的连接QTreeView则的方法吗?
  2. 如何在我的树形视图中使用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(); 
    } 
}; 
+0

谢谢,这澄清了很多! – BrtH

+0

我已经完成了这个工作,并且我已经发现QAbstractItemModel在Python中非常慢。我采用了相同的标准Qt树视图示例并将其转换为Python,并且性能没有QStandardItemModel甚至QTreeWidget那么好,即使使用了10k +项目,我也没有做任何事情。 –

+0

@EricHulser - 嗯。无法评论,只用C++完成,但这并不是一个好兆头......如果这不可行,你最终会用到什么? –