QTableWidget繼承自QTableView。QSqlTableModel能與QTableView綁定,但不能於QTableWidget綁定。
QSqlTableModel *model = new QSqlTableModel; model->setTable("employee"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); model->removeColumn(0); // don't show the ID model->setHeaderData(0, Qt::Horizontal, tr("Name")); model->setHeaderData(1, Qt::Horizontal, tr("Salary"));QTableView *view = new QTableView; view->setModel(model); view->show(); |
模型視圖結構
Qt4中引入了模型/視圖架構來完成資料與表現的分離,這在Qt4中稱為InterView架構。
MVC設計模式是起源於Smalltalk的一種與使用者介面相關的設計模式。MVC包括三個元素:模型(Model)表示資料,視圖(View)是使用者介面,控制(Controler)定義了使用者在介面上的操作。通過使用MVC模式,有效分離了資料和使用者介面,使得設計更為靈活,更能適應變化。
模型:所有的模型都基於QAbstractItemModel類,該類是抽象基類。
視圖:所有的視圖都從抽象基類QAbstractItemView繼承。
Interview架構提供了一些常見的模型類和視圖類,例如QStandardItemModel,QDirModel,QStringListModel和QColumnView,QHeaderView,QListView,QTableView,QTreeView。
相對於使用現有的模型和視圖,Qt還提供了更為便捷的類來處理常見的一些資料模型。他們將模型和視圖合一,便於處理一些常規的資料類型。使用這些類型雖然簡單方便,但也失去了模型視圖結構的靈活性,所以要根據具體情況來選擇。
具體區別表格
區別點 |
QTableView |
QTableWidget |
| 繼承關係 |
|
QTableWidget繼承自QTableView |
| 使用資料模型setModel |
可以使用setModel設定資料模型 |
setModel是私人函數,不難使用該函數設定資料模型 |
| 顯示複選框setCheckState |
沒有函數實現複選框 |
QTableWidgetItem類中的setCheckState(Qt::Checked);可以設定複選框 |
| 與QSqlTableModel綁定 |
QTableView能與QSqlTableModel綁定 |
QTableWidget能與QSqlTableModel綁定 |
| |
|
|
| |
|
|
View與Model綁定注意事項
但視圖與模型繫結時,模型必須使用new來建立。否則視圖不能隨著模型的改變而改變。
| Eorror錯誤的寫法 |
QStandardItemModel model(4,2); model.setHeaderData(0, Qt::Horizontal, tr("Label")); model.setHeaderData(1, Qt::Horizontal, tr("Quantity")); ui.tableView->setModel(&model); for (int row = 0; row < 4; ++row) { for (int column = 0; column < 2; ++column) { QModelIndex index = model.index(row, column, QModelIndex()); model.setData(index, QVariant((row+1) * (column+1))); } } |
| Right 正確的寫法 |
QStandardItemModel *model; model = new QStandardItemModel(4,2); ui.tableView->setModel(model); model->setHeaderData(0, Qt::Horizontal, tr("Label")); model->setHeaderData(1, Qt::Horizontal, tr("Quantity")); for (int row = 0; row < 4; ++row) { for (int column = 0; column < 2; ++column) { QModelIndex index = model->index(row, column, QModelIndex()); model->setData(index, QVariant((row+1) * (column+1))); } } |