#(57):可視化顯示數據庫數據
前面我們用了兩個章節介紹了 Qt 提供的兩種操作數據庫的方法。顯然,使用`QSqlQuery`的方式更靈活,功能更強大,而使用`QSqlTableModel`則更簡單,更方便與 model/view 結合使用(數據庫應用很大一部分就是以表格形式顯示出來,這正是 model/view 的強項)。本章我們簡單介紹使用`QSqlTableModel`顯示數據的方法。當然,我們也可以選擇使用`QSqlQuery`獲取數據,然后交給 view 顯示,而這需要自己給 model 提供數據。鑒于我們前面已經詳細介紹過如何使用自定義 model 以及如何使用`QTableWidget`,所以我們這里不再詳細說明這一方法。
我們還是使用前面一直在用的 student 表,直接來看代碼:
~~~
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (connect("demo.db")) {
QSqlTableModel *model = new QSqlTableModel;
model->setTable("student");
model->setSort(1, Qt::AscendingOrder);
model->setHeaderData(1, Qt::Horizontal, "Name");
model->setHeaderData(2, Qt::Horizontal, "Age");
model->select();
QTableView *view = new QTableView;
view->setModel(model);
view->setSelectionMode(QAbstractItemView::SingleSelection);
view->setSelectionBehavior(QAbstractItemView::SelectRows);
// view->setColumnHidden(0, true);
view->resizeColumnsToContents();
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
QHeaderView *header = view->horizontalHeader();
header->setStretchLastSection(true);
view->show();
} else {
return 1;
}
return a.exec();
}
~~~
這里的`connect()`函數還是我們前面使用過的,我們主要關注剩下的代碼。
正如[前一章](http://www.devbean.net/2013/06/qt-study-road-2-sql-model/)的代碼所示,我們在`main()`函數中創建了`QSqlTableModel`對象,使用 student 表。student 表有三列:id,name 和 age,我們選擇按照 name 排序,使用`setSort()`函數達到這一目的。然后我們設置每一列的列頭。這里我們只使用了后兩列,第一列沒有設置,所以依舊顯示為列名 id。
在設置好 model 之后,我們又創建了`QTableView`對象作為視圖。注意這里的設置:單行選擇,按行選擇。`resizeColumnsToContents()`說明每列寬度適配其內容;`setEditTriggers()`則禁用編輯功能。最后,我們設置最后一列要充滿整個窗口。我們的代碼中有一行注釋,設置第一列不顯示。由于我們使用了`QSqlTableModel`方式,不能按列查看,所以我們在視圖級別上面做文章:將不想顯示的列隱藏掉。
接下來運行代碼即可看到效果:
[](http://files.devbean.net/images/2013/06/sql-model-view.png)
如果看到代碼中很多“魔術數字”,更好的方法是,使用一個枚舉將這些魔術數字隱藏掉,這也是一種推薦的方式:
~~~
enum ColumnIndex
{
Column_ID = 0,
Column_Name = 1,
Column_Age = 2
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (connect("demo.db")) {
QSqlTableModel *model = new QSqlTableModel;
model->setTable("student");
model->setSort(Column_Name, Qt::AscendingOrder);
model->setHeaderData(Column_Name, Qt::Horizontal, "Name");
model->setHeaderData(Column_Age, Qt::Horizontal, "Age");
model->select();
QTableView *view = new QTableView;
view->setModel(model);
view->setSelectionMode(QAbstractItemView::SingleSelection);
view->setSelectionBehavior(QAbstractItemView::SelectRows);
view->setColumnHidden(Column_ID, true);
view->resizeColumnsToContents();
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
QHeaderView *header = view->horizontalHeader();
header->setStretchLastSection(true);
view->show();
} else {
return 1;
}
return a.exec();
}
~~~
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)