2015-10-10 169 views
1

我有一個QStandardItemModel。該模型可能會通過輸入小部件獲得更多列。隱藏QTreeView中QStandardItemModel的未來列

另外,QStandardItemModelQTreeView的型號。

我想保證只有QStandardItemModel的前n列在QTreeView中可視化。

我怎麼能做到這一點?

但是:

  • 該模型是不知道的看法(預計Qt的做了背景)
  • 的觀點沒有被通知更新的列在我的代碼。儘管如此,新的柱子是可視化的。

我的動機是什麼?

我想將QTreeView中的前n列可視化。在選擇一個項目時,(所選項目的行的)其餘列應作爲行以QTableWidget呈現。

+0

您是使用'QTreeView'還是'QTreeWidget'向您展示模型? – agold

+0

我想隱藏'QTreeView'中的列。我更新了上面的文字。 – Tob

+0

根據你的邏輯創建你自己的'QSortProxyFilterModel'並重載'acceptRow'方法。 –

回答

1

但是:

  • 該模型是不知道的看法(預計Qt的做了背景)
  • 的觀點沒有被通知更新的列在我的代碼。儘管如此,新的柱子是可視化的。

你是對的,模型不知道視圖。這正是它應該如何,是一種好的做法。 Qt模型 - 視圖框架是一個很好的實際實施Model-View-Controller (MVC) Pattern

模型不應該知道什麼將被查看或不是,他們的責任是存儲和組織數據和這些數據的屬性。

視圖連接到模型並與它們具有隻讀關係。當對模型進行更改時,必須通知他們,以便他們知道他們必須更新自己。在Qt中,這是通過將模型中的信號連接到視圖中的插槽來完成的。這些連接是在功能方面與Qt列和顯示器製造QAbstractItemView::setModel

你的問題涉及具體而言,主要的項目視圖類委託行和列知名度的QHeaderView類,它是由所有視圖自動創建的責任默認。

如果要創建特殊功能,您需要操作這些默認視圖,或者將自定義標題視圖設置爲主視圖。

我已經完成了第二個選項。

我也將模型連接到兩個視圖,一個僅限於顯示前5列,第二個沒有自定義標題視圖。這是爲了表明底層模型完全不瞭解查看限制並仍包含完整的數據集。

#include <QtWidgets/QApplication> 
#include <QtWidgets/qtreeview.h> 
#include <QtGui/qstandarditemmodel.h> 
#include <QtWidgets/QHeaderView> 

class RestrictedHeaderView : public QHeaderView { 
    Q_OBJECT 
public: 
    RestrictedHeaderView(int cols, QWidget *parent = 0) : QHeaderView(Qt::Horizontal, parent), visibleColumns(cols) {} 

protected slots: 
    virtual void sectionsInserted(QModelIndex const &parent, int logicalFirst, int logicalLast){ 
     if (!parent.isValid() && logicalLast >= visibleColumns){ 
      for (int col = visibleColumns; col <= logicalLast; ++col){ 
       hideSection(col); 
      } 
     } 
    } 

private: 
    int visibleColumns; 
}; 

#include "main.moc" 

int main(int argc, char** argv){ 
    QApplication app(argc, argv); 

    QTreeView view; 
    view.setWindowTitle("Limited View"); 
    QTreeView view2; 
    view2.setWindowTitle("Complete View"); 

    QStandardItemModel model(4, 4); 
    for(int row = 0; row < 4; ++row){ 
     for(int column = 0; column < 4; ++column){ 
      QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column)); 
      model.setItem(row, column, item); 
     } 
    } 

    // Apply the model to both views and show them 
    view.setModel(&model); 
    view.show(); 
    view2.setModel(&model); 
    view2.show(); 

    // set a custom header to the limited view only so that it automatically hides all columns that are inserted after the fifth column 
    view.setHeader(new RestrictedHeaderView(5)); 

    // Add new columns to the underlying model 
    model.insertColumns(4, 3); 
    for (int row = 0; row < 4; ++row){ 
     for(int column = 4; column < 7; ++column){ 
      QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column)); 
      model.setItem(row, column, item); 
     } 
    } 

    return app.exec(); 
}