前面咱們用了兩個章節介紹了 Qt 提供的兩種操做數據庫的方法。顯然,使用QSqlQuery
的方式更靈活,功能更強大,而使用QSqlTableModel
則更簡單,更方便與 model/view 結合使用(數據庫應用很大一部分就是以表格形式顯示出來,這正是 model/view 的強項)。本章咱們簡單介紹使用QSqlTableModel
顯示數據的方法。固然,咱們也能夠選擇使用QSqlQuery
獲取數據,而後交給 view 顯示,而這須要本身給 model 提供數據。鑑於咱們前面已經詳細介紹過如何使用自定義 model 以及如何使用QTableWidget
,因此咱們這裏再也不詳細說明這一方法。sql
咱們仍是使用前面一直在用的 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()
函數仍是咱們前面使用過的,咱們主要關注剩下的代碼。函數
正如前一章的代碼所示,咱們在main()
函數中建立了QSqlTableModel
對象,使用 student 表。student 表有三列:id,name 和 age,咱們選擇按照 name 排序,使用setSort()
函數達到這一目的。而後咱們設置每一列的列頭。這裏咱們只使用了後兩列,第一列沒有設置,因此依舊顯示爲列名 id。.net
在設置好 model 以後,咱們又建立了QTableView
對象做爲視圖。注意這裏的設置:單行選擇,按行選擇。resizeColumnsToContents()
說明每列寬度適配其內容;setEditTriggers()
則禁用編輯功能。最後,咱們設置最後一列要充滿整個窗口。咱們的代碼中有一行註釋,設置第一列不顯示。因爲咱們使用了QSqlTableModel
方式,不能按列查看,因此咱們在視圖級別上面作文章:將不想顯示的列隱藏掉。code
接下來運行代碼便可看到效果:對象
若是看到代碼中不少「魔術數字」,更好的方法是,使用一個枚舉將這些魔術數字隱藏掉,這也是一種推薦的方式:排序
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(); }