2012-04-03 44 views
2

假設我想使用QTableViewQAbstractTableModel類實現模型/視圖體系結構。所以我將QAbstractTableModel分類以創建類MyModel並實現QAbstractTableModel接口。然後使用setModel方法將此型號的實例連接到QTableView實例。如何在Qt中創建一個不變的只讀模型/視圖體系結構?

#include <QtGui/QApplication> 
#include <QtGui/QTableView> 
#include "mymodel.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTableView tableView; 
    MyModel myModel(0);  
    tableView.setModel(&myModel); 
    tableView.show(); 
    return a.exec(); 
} 

但我該如何讓模型只讀?我無法聲明

const MyModel myModel(0); 

因爲setModel採用非常量參數。我只重新實現了QAbstractTableModel的常量方法。

回答

5

在這種情況下,const是什麼意思?你想實現什麼?

你是否希望自己的基礎數據是不可變的 - 所以從QTableView的版本將是不可能的?然後只是禁止編輯模型 - 例如通過不執行setData

還要注意的是

Qt::ItemFlags QAbstractItemModel::flags (const QModelIndex & index) const 

standard implementation不會返回Qt::ItemIsEditable這已經足夠了。

你必須小心不要修改UI之外的模型(請注意,外界對其進行修改,而不發送適當的信號可能會導致壞事)。但是,因爲它是你的代碼 - 這不應該成爲一個問題。

+0

我只是希望能夠通過使用該對象的常數法從另一個對象模型。這不是一個大問題,但是一旦我使某種方法不是恆定的,當它應該是恆定的,那麼這也會擴展到使用這種方法的其他方法。 – 2012-04-03 08:00:17

+1

我看到Qt代碼,使用殘酷'const_cast'方法處理這些問題。不是那種優雅,潛在的危險,但是... – Anonymous 2012-04-03 08:40:35

+0

這正是我一直在尋找的東西 – 2012-04-03 09:59:47

2

你不能使模型常數,因爲有事情的看法需要能夠做到這一點影響了化QAbstractItemModel對象,如創建持久模型索引。

溝通的事實,你的模型是隻讀視圖的最佳方法是通過覆蓋QAbstractTableModel::flags始終未設置ItemIsEditable:

Qt::ItemFlags MyModel::flags (const QModelIndex & index) const 
{ 
    return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable; 
} 
2

那麼假設你的意思是由最終用戶只讀,而不是隻讀的程序員,this article解釋說,該模型是唯一可編輯的,當你重新實現QAbstractItemModel::flags()QAbstractItemModel::setData(),以及同樣重要的是QAbstractItemModel::setHeaderData()

此外,你需要重寫爲只讀模式的功能,所有const

Qt::ItemFlags TreeModel::flags(QModelIndex const & index) const { } 
QModelIndex TreeModel::index(int row, int column, QModelIndex const & parentIndex) const { } 
QModelIndex TreeModel::parent(QModelIndex const & childIndex) const { } 
QVariant TreeModel::data(QModelIndex const & index, int role) const { } 
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { } 
int TreeModel::rowCount(QModelIndex const & parent) const { } 
int TreeModel::columnCount(QModelIndex const & parent) const { } 
相關問題