2012-08-25 4 views
2

sqlalchemy에서 얻은 데이터를 보여주는 QTreeView를 만들고 싶습니다. 1,000 ~ 10,000 행이 표시됩니다. 모델을 sqlalchemy에 연결하는 것이 상대적으로 쉽다고 생각했기 때문에 모델을 사용하는 것이 더 간단한 QTreeWidget보다 좋을 것이라고 생각했습니다. 왜냐하면이 작업이 꽤 자주 수행 된 것으로 생각했기 때문입니다. 분명히 그것은 아닙니다 ... 나는이 좋은 예를 찾을 수 없습니다.QTreeView with sqlalchemy

나는 QStandardItemModel의 문서를 살펴 봤다. 나는 그것을 이해할 때마다 모든 값을위한 QStandardItem을 만들어야 만했다. 수천 개의 행과 9 개의 열이있는 상황에서 이것은 매우 느릴 것이라고 생각합니다.
이전에 wxpython에서 ObjectListView으로 작업했으며 Qt의 treeview가 비슷하게 작동하기를 기대하면서 이렇게 복잡 할 것임을 알았을 때 실망감을 상상할 수있었습니다. P.

그래서 내 질문 :

  1. 는 QTreeView에 SQLAlchemy의를 연결하는 방법이 있나요?
  2. 내 TreeView에서 sqlaclhemy가 반환하는 항목을 어떻게 사용할 수 있습니까? (ObjectListView에 의해 수행 된 것과 같이)

나는 모델과 뷰 (그리고 Qt)에 관해서 매우 새롭기 때문에 이것에 관해 말할만한 대답, 설명, 링크, 유용한 힌트 또는 whatsever가 매우있다. 환영!

답변

2

아니요은 QStandardItem을 생성해야합니다. Qt 뷰 클래스는 데이터 클래스의 메서드를 호출하지 않으므로 원하는 방식으로 데이터를 저장할 수 있습니다. 모델 클래스의 메소드 만 호출합니다 (Ruby on Rails와는 달리 Qt에서는 각 데이터 클래스가 모델로 간주됩니다. "모델"은 데이터 클래스의 전체 컬렉션을 의미합니다).

서브 클래 싱을 QAbstractItemModel ("서브 클래 싱"섹션 참조)하고 거기에서 작업하는 것이 좋습니다. 단순한 목록 만 가지고 있다면 사용자 지정 모델이 데이터베이스에서 반환 된 결과를 단순히 래핑하도록 설정할 수도 있습니다.

나는 이것을 C++로했는데, 내 머리를 감싸는 데 꽤 오래 걸렸지 만, 한 번 사용하면 작업하기가 쉬웠다. 읽기 전용 모델에 대한 기본 코드는 다음과 같습니다. 파이썬으로 변환해야하지만 잘하면 내 고통을 덜어줍니다!

참고 : 아래 코드는 귀하의 데이터가 일반 목록 (상위 - 하위 관계 없음)이라고 가정합니다. 그렇지 않은 경우 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이 파이썬에서 느리게 진행되는 것을 발견했습니다. 동일한 표준 Qt 트리보기 예제를 가져 와서 Python으로 변환 했으므로 성능은 QStandardItemModel 또는 심지어 QTreeWidget을 사용하는 것보다 훨씬 좋았습니다 (10k + 항목이 있더라도). 나는 아무 것도하지 않았습니다. –

+0

@EricHulser - 음. C++로만 해본 적이 있지만, 그게 좋지 않다는 말은 할 수 없다. –