先說一下QTableWidget 與 QTabelView區別,剛開始感覺容易混淆,多理解理解會感覺實現的效果類似,只是實現的方式有區別:
-
QTableWidget是QTableView的子類,主要的區別是QTableView可以使用自定義的數據模型來顯示內容(也就是先要通過setModel來綁定數據源);
-
而QTableWidget則只能使用標準的數據模型,並且其單元格數據是QTableWidgetItem的對象來實現的(也就是不需要數據源,將逐個單元格內的信息填好即可)。
-
主要體現在QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,正個表格都需要用逐個單元格構建起來。
先上圖:
三種方式創建表格:
方式1:QT Designer 控件欄裏托出來一個,直接使用;
方式2:QTableWidget *tableWidget = new QTableWidget(3,2);
// 構造了一個QTableWidget的對象,並且設置爲3行,2列;
方式3:可用下面的方法構造QTableWidget對象
QTableWidget *tableWidget = new QTableWidget;
tableWidget->setRowCount(3); //設置行數爲3
tableWidget->setColumnCount(2); //設置列數爲2
一.對QTableWidget本身的效果實現
- 將表格變爲禁止編輯
在默認情況下,表格裏的字符是可以更改的,比如雙擊一個單元格,就可以修改原來的內容,
如果想禁止用戶的這種操作,讓這個表格對用戶只讀,可以這樣:
tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚舉中的一個,都是觸發修改單元格內容的條件:
QAbstractItemView.NoEditTriggers | 0 | No editing possible. 不能對錶格內容進行修改 |
---|---|---|
QAbstractItemView.CurrentChanged | 1 | Editing start whenever current item changes.任何時候都能對單元格修改 |
QAbstractItemView.DoubleClicked | 2 | Editing starts when an item is double clicked.雙擊單元格 |
QAbstractItemView.SelectedClicked | 4 | Editing starts when clicking on an already selected item.單擊已選中的內容 |
QAbstractItemView.EditKeyPressed | 8 | Editing starts when the platform edit key has been pressed over an item. |
QAbstractItemView.AnyKeyPressed | 16 | Editing starts when any key is pressed over an item.按下任意鍵就能修改 |
QAbstractItemView.AllEditTriggers | 31 | Editing starts for all above actions.以上條件全包括 |
- 設置表格爲整行選擇
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式
QAbstractItemView.SelectionBehavior枚舉還有如下類型
Constant | Value | Description |
---|---|---|
QAbstractItemView.SelectItems | 0 | Selecting single items.選中單個單元格 |
QAbstractItemView.SelectRows | 1 | Selecting only rows.選中一行 |
QAbstractItemView.SelectColumns | 2 | Selecting only columns.選中一列 |
3.單個選中和多個選中的設置:
tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //設置爲可以選中多個目標
該函數的參數還可以是:
QAbstractItemView.NoSelection 不能選擇
QAbstractItemView.SingleSelection 選中單個目標
QAbstractItemView.MultiSelection 選中多個目標
QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelection 的區別不明顯,
主要功能是正常情況下是單選,但按下Ctrl或Shift鍵後,可以多選
- 表格表頭的顯示與隱藏
對於水平或垂直方法的表頭,可以用以下方式進行 隱藏/顯示 的設置:
tableWidget->verticalHeader()->setVisible(false); //隱藏列表頭
tableWidget->horizontalHeader()->setVisible(false); //隱藏行表頭
注意:需要 #include <QHeaderView>
- 對錶頭文字的字體、顏色進行設置
QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //獲得水平方向表頭的Item對象
columnHeaderItem0->setFont(QFont("Helvetica")); //設置字體
columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //設置單元格背景顏色
columnHeaderItem0->setTextColor(QColor(200,111,30)); //設置文字顏色
注意:需要 #include <QHeaderView>
- 在單元格里加入控件:
QTableWidget不僅允許把文字加到單元格,還允許把控件也放到單元格中。比如,把一個下拉框加入單元格,可以這麼做:
QComboBox *comBox = new QComboBox();
comBox->addItem("Y");
comBox->addItem("N");
tableWidget->setCellWidget(0,2,comBox);
讀取QComboBox 信息:
QWidget * widget=ui->tableWidget->cellWidget(i,0);//獲得widget
QComboBox *combox=(QComboBox*)widget;//強制轉化爲QComboBox
QString string=combox->currentText();
qDebug()<<string;
二. 對單元格的進行設置
- 單元格設置字體顏色和背景顏色 及字體字符
QTableWidgetItem *item = new QTableWidgetItem("Test");
item->setBackgroundColor(QColor(0,60,10));
item->setTextColor(QColor(200,111,100));
item->setFont(QFont("Helvetica"));
tableWidget->setItem(0,3,item);
另:如果需要對所有的單元格都使用這種字體,則可以使用 tableWidget->setFont(QFont("Helvetica"));
- 設置單元格內文字的對齊方式
這個比較簡單,使用newItem.setTextAlignment()函數即可,該函數的參數爲單元格內的對齊方式,和字符輸入順序是自左相右還是自右向左。
水平對齊方式有:
Qt.AlignLeft
Qt.AlignRight
Qt.AlignHCenter
Qt.AlignJustify
垂直對齊方式:
Qt.AlignTop
Qt.AlignBottom
Qt.AlignVCenter
如果兩種都要設置,只要用 Qt.AlignHCenter | Qt.AlignVCenter 的方式即可
- 合併單元格效果的實現:
tableWidget->setSpan(0, 0, 3, 1) # 其參數爲: 要改變單元格的 1行數 2列數 要合併的 3行數 4列數
- 設置單元格的大小
首先,可以指定某個行或者列的大小
tableWidget->setColumnWidth(3,200);
tableWidget->setRowHeight(3,60);
還可以將行和列的大小設爲與內容相匹配
tableWidget->resizeColumnsToContents();
tableWidget->resizeRowsToContents();
- 獲得單擊單元格的內容
通過實現 itemClicked (QTableWidgetItem *) 信號的槽函數,就可以獲得鼠標單擊到的單元格指針,
進而獲得其中的文字信息
connect(tableWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
this,SLOT(getItem(QTreeWidgetItem*,int)));
//將itemClicked信號與函數getItem綁定
6.QTableWidget要調整表格行寬主要涉及以下一個函數
resizeColumnsToContents(); 根據內容調整列寬
resizeColumnToContents(int col); 根據內容自動調整給定列寬
horizontalHeader()->setResizeMode 把給定列設置爲給定模式
主要模式有Stretch和Fixed
7.添加表頭內容:
方法一:
QStringList header;
header<<""<<tr("1")<<tr("2")<<tr("3")<<tr("4)<<tr("5");
方法二:
tableWidget->setHorizontalHeaderLabels(QStringList() << tr("1")
<<tr("2")<<tr("3")<<tr("4)<<tr("5"));
8 排序:
tableWidget->sortByColumn(0, Qt::AscendingOrder);//顧名思義,該函數意思是將某列按升序/降序的方式排列
9 設置表格改變大小固定
行:
QHeaderView *headerView = ui.tableWidget->horizontalHeader();
headerView->setSectionResizeMode(QHeaderView::Fixed);
列:
QHeaderView *vertical = ui.tableWidget->verticalHeader();
vertical->setSectionResizeMode(QHeaderView::Fixed);//列表不能移動
10:代碼實現某行高亮
//設定選擇行爲,按行選擇
ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
//設置選中行的背景色,必須要顯示設置,即代碼設置或者在ui文件的控件中設置,用系統默認的是
無法代碼選中高亮某行
ui.tableWidget->setStyleSheet("selection-background-color:rgb(220,20,60)");
//設置要選中高亮的行,這裏會觸發QTableWidget::itemClicked的信號
ui.tableWidget->selectRow(1); //具體行號
11 設置表格隔行換色
ui.tableWidget->setAlternatingRowColors(true);
ui.tableWidget->setStyleSheet("QTableView{background-color: rgb(250, 250, 115);"
"alternate-background-color: rgb(50, 110, 255);}");
12.表格設置使用細節總結1
int row = rowCount();
removeRow(row);//清除已有的行列
setShowGrid(true);//顯示錶格線
verticalHeader()->setVisible(false);//隱藏左邊垂直
QHeaderView *headerView = horizontalHeader();
headerView->setMovable(false);//去除表頭的移動
headerView->resizeSection(0,284);//設置第一列寬
headerView->resizeSection(1,127);//設置第二列寬
headerView->setResizeMode(QHeaderView::Fixed);//列表不能移動
headerView->setClickable(false);//不響應鼠標單擊
setEditTriggers(QTableWidget::NoEditTriggers);//不能編輯
setSelectionBehavior(QTableWidget::SelectRows);//一次選中一行
setSelectionMode(QAbstractItemView::SingleSelection);//只能單選
/*QScrollBar *scrollBar = horizontalScrollBar();
scrollBar->hide();*/
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去掉水平滾動條
setVerticalScrollMode(QAbstractItemView::ScrollPerItem);//垂直滾動條按項移動
setAutoScroll(false);//去掉自動滾動
13.常用補充
//設置表頭背景色
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");
//設置選中背景色
tableWidget->setStyleSheet("selection-background-color:lightblue;");
//設置表格隔行換色
tableWidget->setAlternatingRowColors(true);
tableWidget->setStyleSheet("QTableView{background-color: rgb(250, 250, 115);
" "alternate-background-color: rgb(50, 110, 255);}");
//設置行距
tableWidget->verticalHeader()->setDefaultSectionSize(10);
感謝,學習:https://blog.csdn.net/polokang/article/details/6696982
https://blog.csdn.net/zhangxuechao_/article/details/81943463