但是:
- 該模型是不知道的看法(預計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();
}
您是使用'QTreeView'還是'QTreeWidget'向您展示模型? – agold
我想隱藏'QTreeView'中的列。我更新了上面的文字。 – Tob
根據你的邏輯創建你自己的'QSortProxyFilterModel'並重載'acceptRow'方法。 –