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