qt中Qtableview的用法
QTableView常用于實現數據的表格顯示。下面我們如何按步驟實現學生信息表格:
一?添加表頭
????//準備數據模型
????QStandardItemModel?*student_model?=?new?QStandardItemModel();
????student_model->setHorizontalHeaderItem(0,?new?QStandardItem(QObject::tr("Name")));
????student_model->setHorizontalHeaderItem(1,?new?QStandardItem(QObject::tr("NO.")));
????student_model->setHorizontalHeaderItem(2,?new?QStandardItem(QObject::tr("Sex")));
????student_model->setHorizontalHeaderItem(3,?new?QStandardItem(QObject::tr("Age")));
????student_model->setHorizontalHeaderItem(4,?new?QStandardItem(QObject::tr("College")));
????//利用setModel()方法將數據模型與QTableView綁定
????ui->student_tableview->setModel(student_model);
二?設置表格屬性
????//設置列寬不可變動,即不能通過鼠標拖動增加列寬????????
????ui->student_tableview->horizontalHeader()->setResizeMode(0,?QHeaderView::Fixed);???
????ui->student_tableview->horizontalHeader()->setResizeMode(1,?QHeaderView::Fixed);???
????ui->student_tableview->horizontalHeader()->setResizeMode(2,?QHeaderView::Fixed);???
????ui->student_tableview->horizontalHeader()->setResizeMode(3,?QHeaderView::Fixed);???
????ui->student_tableview->horizontalHeader()->setResizeMode(4,?QHeaderView::Fixed);???
????//設置表格的各列的寬度值????????
????ui->student_tableview->setColumnWidth(0,100);????
????ui->student_tableview->setColumnWidth(1,100);????
????ui->student_tableview->setColumnWidth(2,100);????
????ui->student_tableview->setColumnWidth(3,100);????
????ui->student_tableview->setColumnWidth(4,100);????????
????//默認顯示行頭,如果你覺得不美觀的話,我們可以將隱藏????????
????ui->student_tableview->verticalHeader()->hide();???????
????//設置選中時為整行選中????????
????ui->student_tableview->setSelectionBehavior(QAbstractItemView::SelectRows);?????????
??????
????//設置表格的單元為只讀屬性,即不能編輯????????
????ui->student_tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);??????????
????//如果你用在QTableView中使用右鍵菜單,需啟用該屬性????????
????ui->tstudent_tableview->setContextMenuPolicy(Qt::CustomContextMenu);
?
三?動態添加行
????在表格中添加行時,我們只需要在model中插入數據即可,一旦model中的數據發生變化,QTabelView顯示就會做相應的變動
????//在第一行添加學生張三的個人信息(setItem函數的第一個參數表示行號,第二個表示列號,第三個為要顯示的數據)
????student_model->setItem(0,?0,?new?QStandardItem(“張三"));
????student_model->setItem(0,?1,?new?QStandardItem("20120202"));
????student_model->setItem(0,?2,?new?QStandardItem("男"));
????student_model->setItem(0,?3,?new?QStandardItem("18"));
????student_model->setItem(0,?4,?new?QStandardItem("土木學院"));
四?設置數據顯示的樣式?
????//設置單元格文本居中,張三的數據設置為居中顯示
????student_model->item(0,?0)->setTextAlignment(Qt::AlignCenter);
????student_model->item(0,?1)->setTextAlignment(Qt::AlignCenter);
????student_model->item(0,?2)->setTextAlignment(Qt::AlignCenter);
????student_model->item(0,?3)->setTextAlignment(Qt::AlignCenter);
????student_model->item(0,?4)->setTextAlignment(Qt::AlignCenter);
????//設置單元格文本顏色,張三的數據設置為紅色
????student_model->item(0,?0)->setForeground(QBrush(QColor(255,?0,?0)));?
????student_model->item(0,?1)->setForeground(QBrush(QColor(255,?0,?0)));?
????student_model->item(0,?2)->setForeground(QBrush(QColor(255,?0,?0)));?
????student_model->item(0,?3)->setForeground(QBrush(QColor(255,?0,?0)));?
????student_model->item(0,?4)->setForeground(QBrush(QColor(255,?0,?0)));?
????//將字體加粗
????student_model->item(0,?0)->setFont(?QFont(?"Times",?10,?QFont::Black?)?);
????student_model->item(0,?1)->setFont(?QFont(?"Times",?10,?QFont::Black?)?);
????student_model->item(0,?2)->setFont(?QFont(?"Times",?10,?QFont::Black?)?);
????student_model->item(0,?3)->setFont(?QFont(?"Times",?10,?QFont::Black?)?);
????student_model->item(0,?4)->setFont(?QFont(?"Times",?10,?QFont::Black?)?);
????//設置排序方式,按年齡降序顯示
????student_model->sort(3,?Qt::DescendingOrder);
Qt QStandardItemModel用法(超級詳細)
QStandardItemModel 是標準的以項數據(item data)為基礎的標準數據模型類,通常與 QTableView 組合成 Model/View 結構,實現通用的二維數據的管理功能。
本節介紹 QStandardltemModel 的使用,主要用到以下 3 個類:
這幾個類之間的關系是:QTableView 是界面視圖組件,其關聯的數據模型是 QStandardItem Model,關聯的項選擇模型是 QItemSelectionModel,QStandardItemModel 的數據管理的基本單元是 QStandardItem。
實例 samp5_3 演示 QStandardItemModel 的使用,其運行時界面如圖 1 所示。
圖 1 實例 samp5_3 的運行時界面
該實例具有如下功能:
- 打開一個純文本文件,該文件是規則的二維數據文件,通過字符串處理獲取表頭和各行各列的數據,導入到一個 QStandardItemModel 數據模型。
- 編輯修改數據模型的數據,可以插入行、添加行、刪除行,還可以在 QTableView 視圖組件中直接修改單元格的數據內容。
- 可以設置數據模型中某個項的不同角色的數據,包括文字對齊方式、字體是否粗體等。
- 通過 QItemSelectionModel 獲取視圖組件上的當前單元格,以及選擇單元格的范圍,對選擇的單元格進行操作。
- 將數據模型的數據內容顯示到 QPlainTextEdit 組件里,顯示數據模型的內容,檢驗視圖組件上做的修改是否與數據模型同步。
- 將修改后的模型數據另存為一個文本文件。
界面設計與主窗口類定義
本實例的主窗口從 QMainWindow 繼承而來,中間的 TableView 和 PlainTextEdit 組件采用水平分割條布局。在 Action 編輯器中創建如圖 2 所示的一些 Action,并由 Action 創建主工具欄上的按鈕,下方的狀態欄設置了幾個 QLabel 組件,顯示當前文件名稱、當前單元格行號、列號,以及相應內容。
圖 2 實例中創建的 Action
主窗口類 MainWindow 里新增的定義如下(省略了 UI 設計器生成的界面組件的槽函數的聲明):
這里定義了數據模型變量 theModel,項數據選擇模型變量 theSelection。
定義的私有函數 iniModelFromStringList() 用于在打開文件時,從一個 QStringList 變量的內容創建數據模型。
自定義槽函數 on_currentChanged() 用于在 TableView 上選擇單元格發生變化時,更新狀態欄的信息顯示,這個槽函數將會與項選擇模型 theSelection 的 currentChanged() 信號關聯。
QStandardltemModel的使用
系統初始化
在 MainWindow 的構造函數中進行界面初始化,數據模型和選擇模型的創建,以及與視圖組件的關聯,信號與槽的關聯等設置,代碼如下:
在構造函數里首先創建數據模型 theModel,創建數據選擇模型時需要傳遞一個數據模型變量作為其參數。這樣,數據選擇模型 theSelection 就與數據模型 theModel 關聯,用于表示 theModel 的項數據選擇操作。
創建數據模型和選擇模型后,為 TableView 組件設置數據模型和選擇模型:
ui->tableView->setModel (theModel) ; //設置數據模型
ui->tableView->setSelectionModel (theSelection) ; //設置選擇模型
構造函數里還將自定義的槽函數 on_currentChanged() 與 theSelection 的 currentChanged() 信號關聯,用于界面上 tableView 選擇單元格發生變化時,顯示單元格的行號、列號、內容等信息,槽函數代碼如下:
從文本文件導入數據
QStandardItemModel 是標準的基于項數據的數據模型,以類似于二維數組的形式管理內部數據,適合于處理表格型數據,其顯示一般采用 QTableView。
QStandardItemModel 的數據可以是程序生成的內存中的數據,也可以來源于文件。例如,在實際數據處理中,有些數據經常是以純文本格式保存的,它們有固定的列數,每一列是一項數據,實際構成一個二維數據表。圖 3 是本實例程序要打開的一個純文本文件的內容,文件的第 1 行是數據列的文字標題,相當于數據表的表頭,然后以行存儲數據,以 TAB 鍵間隔每列數據。
當單擊工具欄上的“打開文件”按鈕時,需要選擇一個這樣的文件導入到數據模型,并在 tableView 上進行顯示和編輯。圖 3 的數據有 6 列,第 1 列是整數,第 2 至 4 列是浮點數,第 5 列是文字,第 6 列是邏輯型變量,“1”表示 true。
圖 3 純文本格式的數據文件
下面是“打開文件”按鈕的槽函數代碼:
這段代碼讓用戶選擇所需要打開的數據文本文件,然后用只讀和文本格式打開文件,逐行讀取其內容,將每行字符串顯示到界面上的 plainTextEdit 里,并且添加到一個臨時的 QStringList 類型的變量 fFileContent 里。
然后調用自定義函數 iniModelFromStringList(),用 fFileContent 的內容初始化數據模型。下面是 iniModelFromStringList() 函數的代碼:
傳遞來的參數 aFileContent 是文本文件所有行構成的 StringList,文件的每一行是 aFileContent 的一行字符串,第 1 行是表頭文字,數據從第 2 行開始。
程序首先獲取字符串列表的行數,然后設置數據模型的行數,因為數據模型的列數在初始化時己經設置了。
然后獲取字符串列表的第 1 行,即表頭文字,用 QString::split() 函數分割成一個 QStringList,設置為數據模型的表頭標題。
QString::split() 函數根據某個特定的符號將字符串進行分割。例如,header 是數據列的標題, 每個標題之間通過一個或多個 TAB 鍵分隔,其內容是:
測深(m) 垂深(m) 方位(°) 總位移(m) 固井質量 測井取樣
那么通過上面的 split() 函數操作,得到一個字符串列表 headerList,其內容是:
測深(m)
垂深(m)
方位(°)
總位移(m)
固井質量
測井取樣
也就是分解為一個 6 行的 StringList。然后使用此字符串列表作為數據模型,設置表頭標題的函數 setHorizontalHeaderLabels() 的參數,就可以為數據模型設置表頭了。
同樣,在逐行獲取字符串后,也采用 split() 函數進行分解,為每個數據創建一個 QStandardltem 類型的項數據 altem,并賦給數據模型作為某行某列的項數據。
QStandardItemModel 以二維表格的形式保存項數據,每個項數據對應著 QTableView 的一個單元格。項數據不僅可以存儲顯示的文字,還可以存儲其他角色的數據。
數據文件的最后一列是一個邏輯型數據,在 tableView 上顯示時為其提供一個 CheckBox 組件,此功能通過調用 QStandardItem 的 setCheckable() 函數實現。
數據修改
當 TableView 設置為可編輯時,雙擊一個單元格可以修改其內容,對于使用 CheckBox 的列,改變 CheckBox 的勾選狀態,就可以修改單元格關聯項的選擇狀態。
在實例主窗口工具欄上有“添加行”、“插入行”、“刪除行”按鈕,它們實現相應的編輯操作,這些操作都是直接針對數據模型的,數據模型被修改后,會直接在 TableView 上顯示出來。
添加行
“添加行”操作是在數據表的最后添加一行,其實現代碼如下:
使用 QStandardltemModel::insertRow() 函數插入一行,其函數原型是:
void insertRow(int row, const QList<QStandardltem *> fiitems)
其中,row 是一個行號,表示在此行號之前插入一行,若 row 等于或大于總行數,則在最后添加一行。QList<QStandardItem *>&items 是一個 QStandardltem 類型的列表類,需要為插入的一行的每個項數據創建一個 QStandardltem 類型的項,然后傳遞給 insertRow() 函數。
在這段程序中,為前 5 列創建 QStandardItem 對象時,都使用文字“0”,最后一列使用表頭的標題,并設置為 Checkable。創建完每個項數據對象后,使用 insertRow() 函數在最后添加一行。
插入行
“插入行”按鈕的功能是在當前行的前面插入一行,實現代碼與“添加行”類似。
刪除行
“刪除行”按鈕的功能是刪除當前行,首先從選擇模型中獲取當前單元格的模型索引,然后從模型索引中獲取行號,調用 removeRow(int row) 刪除指定的行。
單元格格式設置
工具欄上有 3 個設置單元格文字對齊方式的按鈕,還有一個設置字體粗體的按鈕。當在 TableView 中選擇多個單元格時,可以同時設置多個單元格的格式。例如,“居左”按鈕的代碼如下:
QItemSelectionModel::selectedIndexes() 函數返回選擇單元格的模型索引列表,然后通過此列表獲取每個選擇的單元格的模型索引,再通過模型索引獲取其項數據,然后調用 QStandardItem::setTextAlignment() 設置一個項的對齊方式即可。
“居中”和“居右”按鈕的代碼與此類似。
“粗體”按鈕設置單元格的字體是否為粗體,在選擇單元格時,actFontBold 的 check 狀態根據當前單元格的字體是否為粗體自動更新。actFontBold 的 triggered(bool) 的槽函數代碼如下,與設置對齊方式的代碼操作方式類似:
數據另存為文件
在視圖組件上對數據的修改都會自動更新到數據模型里,單擊工具欄上的“模型數據預覽” 按鈕,可以將數據模型的數據內容顯示到 PlainTextEdit 里。
數據模型里的數據是在內存中的,工具欄上的“另存文件”按鈕可以將數據模型的數據另存 為一個數據文本文件,同時也顯示在 PlainTextEdit 里,其實現代碼如下:
?
清理數據
model_->removeRows(0,model_->rowCount());?
這樣清理數據,就不會影響到表格頭部的數據了。
刪除QWidget中的控件和清空QTableView表格內容用法
本文主要總結刪除QWidget中的控件和清空QTableView表格內容用法,下面將詳細講述這兩種用法的實現方式。
1.1刪除QWidget中的控件(函數removeWidget())
要刪除QWidget中的控件,可以現在QWidget用QVBoxLayout布局,然后用QVBoxLayout::removeWidget(QWidget*)函數刪除指定名稱的控件,刪除后要用delete釋放空間,否則不會顯示出來。
?
QVBoxLayout *m_VBoxLayout = new QVBoxLayout(this); QPushButton *m_button = QPushButton(QStringLiteral("按鈕")); m_VBoxLayout->addWidget(m_button); if(!m_VBoxLayout->isEmpty()) //如果垂直布局器中有控件,則執行刪除控件 { m_VBoxLayout->removeWidget(m_button); //刪除按鈕控件 delete m_button; //釋放控件 qDebug()<<m_VBoxLayout->isEmpty(); //判斷垂直布局是否為空 } ?1.2清空表格控件QTableView(函數clear())
要清空表格控件QTableView,只需要清空模型項QStandItemModel的對象就行。只要用到函數QStandItemModel::clear()就可以了。下面代碼是一個清空QTabView表格的簡單用法。
?
//初始化 QTableView m_TableView = new QTableView; QStandardItemModel *m_StandItemModel = new QStandardItemModel; m_TableView.setModel(m_StandItemModel); m_StandItemModel->clear(); //清空模型時,對應表格的內容會同步清空 ?1.3清空QTabView表格用法同樣適用于列表控件QListView、樹形控件QTreeView。
?
總結:
需要清空QWidget布局管理器中的控件,只需要用到函數QVBoxLayout::removeWidget(QWidget*)。
要清空表格控件QTableView的內容,只需要用到函數QStandItemModel::clear()。
Qt QTableView 如何清理列表里的數據
數據初始化
tableView_ = new QTableView();model_ = new QStandardItemModel();tableView_->setModel(model_);// model 初始化model_->setColumnCount(6);model_->setHeaderData(0, Qt::Horizontal, tr("序號"));model_->setHeaderData(1, Qt::Horizontal, tr("審核編號"));model_->setHeaderData(2, Qt::Horizontal, tr("審核狀態"));model_->setHeaderData(3, Qt::Horizontal, tr("含交易數"));model_->setHeaderData(4, Qt::Horizontal, tr("txid"));model_->setHeaderData(5, Qt::Horizontal, tr("操作"));// tableview 初始化tableView_->setSelectionBehavior(QAbstractItemView::SelectRows); // 選中整行tableView_->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); // 只能單選tableView_->setEditTriggers(QTableView::EditTrigger::NoEditTriggers);tableView_->setAlternatingRowColors(true);tableView_->setColumnWidth(0, 100);tableView_->setColumnWidth(2, 80);tableView_->setColumnWidth(5, 130);tableView_->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Interactive);tableView_->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch);tableView_->horizontalHeader()->setSectionResizeMode(4,QHeaderView::Stretch);#ifdef QT_DEBUGfor(int i = 0; i < 10; ++i) {QStandardItem *item = new QStandardItem();item->setCheckable(true);item->setText(QString::number(i));item->setCheckState(Qt::Unchecked);model_->setItem(i, 0, item);model_->setItem(i, 1, new QStandardItem("654654654"));model_->setItem(i, 2, new QStandardItem("admin"));model_->setItem(i, 3, new QStandardItem("admin"));model_->setItem(i, 4, new QStandardItem("admin"));model_->setItem(i, 5, new QStandardItem("admin"));} #elseonNextPage(0); #endif總結
以上是生活随笔為你收集整理的qt中Qtableview的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT中的容器遍历
- 下一篇: 官方文档: Dubbo 框架设计、模块说