Table 在列出資料概要資訊時非常有用,可以列出重要的欄位,又可以列出較多的資料。可以選擇單一 Cell, 整個 Row 或者是整個 Column,對於操作還蠻有實用性的,本文就介紹 QT 的 Table 元件的一些用法。
加入 QTableView 與設定
QT 有兩種 Table 元件,一個是 QTableWidget,另一個是 QTableView,本文使用的是 QTableView,將其從元件列拉到主視窗中,並將其命名為tbl。
接著點一下該元件,從右邊的屬性視窗修改「SelectionMode」成「MultiSelection」(請改成 Exteneded Selection,較符合一般使用習慣),「SelectionBehavior」設為「SelectRows」。
設定 Table 欄位
在 constructor 內加入欄位個數與文字設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <QStandardItemModel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QStandardItemModel *model = new QStandardItemModel(0,3,this); model->setHorizontalHeaderItem(0, new QStandardItem(QString("ID"))); model->setHorizontalHeaderItem(1, new QStandardItem(QString("Name"))); model->setHorizontalHeaderItem(2, new QStandardItem(QString("Description"))); ui->tbl->setModel(model); ui->tbl->setColumnWidth(0, 80); ui->tbl->setColumnWidth(1, 100); ui->tbl->setColumnWidth(2, 300); } |
加如程式後,重新執行,結果看起來會如下。
加入資料
在畫面上加入一個 button,並在其 click slot上加入以下程式,以達成加入資料的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void MainWindow::on_pushButton_clicked() { static int cnt = 0; int rowCnt; QStandardItemModel *model = (QStandardItemModel *)ui->tbl->model(); rowCnt = model->rowCount(); QStandardItem *i0 = new QStandardItem(QString::number(cnt++)); QStandardItem *i1 = new QStandardItem(""); QStandardItem *i2 = new QStandardItem(""); model->setItem(rowCnt, 0, i0); model->setItem(rowCnt, 1, i1); model->setItem(rowCnt, 2, i2); model->item(rowCnt, 1)->setText("Item" + QString::number(cnt-1)); model->item(rowCnt, 2)->setText("Test Stuff"); } |
加入資料用法上還蠻直覺的,每一個 cell 都是一個 QStandardItem 物件,在新增 row 時,直接用 setItem() 設置其所用的 QStandardItem。QStandardItem 的內容可以在一開始就指定,或在後來用 setText() 來指定。程式的效果如下,可以進行 Multi Selection。
顯示選取的資料
在畫面上加入一個 button,並在其 click slot上加入以下程式,以顯示已選取的項目列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void MainWindow::on_pushButton_2_clicked() { int i; QStandardItemModel *model = (QStandardItemModel *)ui->tbl->model(); QModelIndexList selection = ui->tbl->selectionModel()->selectedRows(); QModelIndex qi; int id; QString disp; for(i=0;i<selection.count();i++) { qi=model->index(selection[i].row(), 0, QModelIndex()); id = model->data(qi).toInt(); //id = model->item(selection[i].row(), 0)->text().toInt(); disp = disp + QString::number(id) + " "; } disp += "項目已選擇"; QMessageBox::information(NULL, "Title", disp, QMessageBox::Yes , QMessageBox::Yes); } |
上面主要是靠 model->index() 來取得指定 row 與 column 的資料,並指定傳回 QModelIndex 型態。接著再以 model->data() 來取得該欄位,再轉成 int。或簡單一點,也可以直接取得 QStandardItem 轉成 int 即可。執行效果如下
清除所有資料
在畫面上加入一個 button,並在其 click slot上加入以下程式,以刪除所有的資料。
1 2 3 4 5 6 7 8 9 10 11 |
void MainWindow::on_pushButton_3_clicked() { int i; QStandardItemModel *model = (QStandardItemModel *)ui->tbl->model(); //model->clear(); for(i=model->rowCount()-1;i>=0;i--) { model->removeRow(i); } } |
如果只是刪除所有項目,其實只要呼叫 model->clear() 即可。這邊我們亦展示如何以row為單位來刪除,這個例子比較能適用到不同的應用。這裡是由後面的列開始刪除,因為回圈的最大值一開始就決定了,若i從0開始刪,每次刪掉一行,table的大小便會減少,到最後 i 會超過 table 的大小,而導致程式錯誤。
結語
Table 是個好使好用的東西,觀看或應用都很方便,學起來後可以大大的增加設定資料方便性。