2016-06-02 16 views
1

ツリー構造を持つQAbstractItemModelから継承する独自のクラスを持っています。QTableViewでQAbstractItemModelのサブ行を表示する方法

QSortFilterProxyModelから派生したクラスを使用して、このモデルのフィルタリングされたデータを表示する2つのビューを使用します。 A、Bは.... "メイン行"(ルートの子)です

root 
| 
-- A 
| |-A1 
| |-A2 
| |-A3 
| 
-- B 
| |-B1 
| |-B2 
| 
... and so on... 

、およびA1、A2、... B1、B2:

私のモデル構造は、次のようになります。 .. "子行" - "メイン行"に追加されたノード行。私は何をする必要があるか今

は、唯一の「子供の行」が表示さQTableViewです:

A1 
A2 
A3 
B1 
B2 

しかし、私はQSortFilterProxyModel(filterAcceptsRow、filterAcceptsColumn)で見つかったフィルタリング方法を、本体のみの行で動作します...

どうすればいいですか?

(私は非常によく似た質問を見つけたが、それはまだ未回答です:QTableView to display only leaves of a tree model implemented with QAbstractItemModel

+1

あなた自身の 'QAbstractProxyModel'を書く必要があります。しかし、インデックスを使って多くの作業をする必要があるため、複雑な作業です。生データにもう一つの 'QAbstractListModel'を書くことをお勧めします。 –

答えて

1

私はこの問題のために3つの可能な解決策を参照してください。

  1. 再実装QAbstractProxyModel:最初の2つのソリューションは、この質問のための彼のコメントでDmitry Sazonovを提供しました。
  2. QAbstractItemModelを再実装し、そのようなビューの別のモデルを作成します。

第3の可能な解決法は、視覚化のためにQStyledItemDelegateを再実装することによって小さなトリックです。私はそのような解決策のための小さな例を作る。

#include <QApplication> 
#include <QTreeView> 
#include <QStyledItemDelegate> 
#include <QStandardItemModel> 

class ZeroHightItemDelegate : public QStyledItemDelegate 
{ 
    Q_OBJECT 
public: 
    ZeroHightItemDelegate(QObject* parent = 0) 
     : QStyledItemDelegate(parent) 
    {} 
    ~ZeroHightItemDelegate(){} 
public: 
    QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const Q_DECL_OVERRIDE 
    { 
     static int defaultHeight = 0; 
     static bool firstSizeHintFlag = true; 
     QSize size = QStyledItemDelegate::sizeHint(option, index); 
     if (firstSizeHintFlag){ 
      defaultHeight = size.height(); 
      firstSizeHintFlag = false; 
     } 
     const QAbstractItemModel* model = index.model(); 
     if (!model) 
      return size; 
     if (model->hasChildren(index)) 
      size.setHeight(0); 
     else 
      size.setHeight(defaultHeight); 
     return size; 
    } 
}; 


int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTreeView myView; 
    myView.setRootIsDecorated(false); 
    QStandardItemModel* model = new QStandardItemModel(&myView); 
    myView.setModel(model); 

    model->insertColumns(0, 1); 
    QStandardItem* headerItem = new QStandardItem("Header"); 
    model->setHorizontalHeaderItem(0, headerItem); 

    QStandardItem* itemA = new QStandardItem("A"); 
    model->appendRow(itemA); 
    QStandardItem* itemB = new QStandardItem("B"); 
    model->appendRow(itemB); 
    QStandardItem* itemA1 = new QStandardItem("A1"); 
    QStandardItem* itemA2 = new QStandardItem("A2"); 
    itemA->appendRow(itemA1); 
    itemA->appendRow(itemA2); 
    QStandardItem* itemB1 = new QStandardItem("B1"); 
    QStandardItem* itemB2 = new QStandardItem("B2"); 
    QStandardItem* itemB3 = new QStandardItem("B3"); 
    itemB->appendRow(itemB1); 
    itemB->appendRow(itemB2); 
    itemB->appendRow(itemB3); 
    myView.setItemDelegate(new ZeroHightItemDelegate(&myView)); 

    myView.expandAll(); 
    myView.show(); 

    return a.exec(); 
} 

#include "main.moc" 
関連する問題