看一下效果很簡單的一個小功能
先說分部講一下過程 再給出詳細代碼
添加數據
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(2); ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"age"); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式 ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改 ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //設置為可以選中單個 ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan")); ui->tableWidget->setItem(0,1,new QTableWidgetItem("1")); ui->tableWidget->verticalHeader()->setVisible(false); //隱藏列表頭 ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi")); ui->tableWidget->setItem(1,1,new QTableWidgetItem("20")); ui->tableWidget->selectRow(0); }
進行增刪除修改操作
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(2); ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"age"); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式 ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改 ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //設置為可以選中單個 ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan")); ui->tableWidget->setItem(0,1,new QTableWidgetItem("1")); ui->tableWidget->verticalHeader()->setVisible(false); //隱藏列表頭 ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi")); ui->tableWidget->setItem(1,1,new QTableWidgetItem("20")); ui->tableWidget->selectRow(0); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) { if(previous!=Q_NULLPTR) { previous->setBackgroundColor(Qt::transparent); } if(current==Q_NULLPTR)return; current->setBackgroundColor(Qt::blue); } void MainWindow::on_btn_Add_clicked() { // QAbstractItemModel *model = ui->tableWidget->model(); // model->insertRow(model->rowCount()); int cols=ui->tableWidget->columnCount(); int rows=ui->tableWidget->rowCount(); qDebug()<<rows; ui->tableWidget->insertRow(rows); for(int i=0;i<cols;i++) { ui->tableWidget->setItem(rows,i,new QTableWidgetItem("new"+QString::number(rows))); } ui->tableWidget->selectRow(rows); } void MainWindow::on_btn_Del_clicked() { QTableWidgetItem * item = ui->tableWidget->currentItem(); if(item==Q_NULLPTR)return; ui->tableWidget->removeRow(item->row()); } void MainWindow::on_btn_Modify_clicked() { QModelIndex index = ui->tableWidget->currentIndex(); QList<QTableWidgetItem *> listItem = ui->tableWidget->selectedItems(); if(listItem.count()==0)return; foreach (QTableWidgetItem * item, listItem) { item->setText("modify"); } // QTableWidgetItem * item = ui->tableWidget->currentItem(); // if(item==Q_NULLPTR)return; // item->setText("modify"); }
這里有一些對TableWidget的設置說明一下
1. 將表格變為禁止編輯
在默認情況下,表格里的字符是可以更改的,比如雙擊一個單元格,就可以修改原來的內容,如果想禁止用戶的這種操作,讓這個表格對用戶只讀,可以這樣:
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.以上條件全包括 |
2. 設置表格為整行選擇
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鍵后,可以多選
4. 表格表頭的顯示與隱藏
對於水平或垂直方法的表頭,可以用以下方式進行 隱藏/顯示 的設置:
tableWidget->verticalHeader()->setVisible(false); //隱藏列表頭 tableWidget->horizontalHeader()->setVisible(false); //隱藏行表頭
5. 對表頭文字的字體、顏色進行設置
QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //獲得水平方向表頭的Item對象 columnHeaderItem0->setFont(QFont("Helvetica")); //設置字體 columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //設置單元格背景顏色 columnHeaderItem0->setTextColor(QColor(200,111,30)); //設置文字顏色
6. 在單元格里加入控件:
QTableWidget不僅允許把文字加到單元格,還允許把控件也放到單元格中。比如,把一個下拉框加入單元格,可以這么做:
QComboBox *comBox = new QComboBox(); comBox->addItem("Y"); comBox->addItem("N"); tableWidget->setCellWidget(0,2,comBox);
6. 在單元格里加入控件:
QWidget * widget=ui->tableWidget->cellWidget(i,0);//獲得widget QComboBox *combox=(QComboBox*)widget;//強制轉化為QComboBox QString string=combox->currentText(); qDebug()<<string;
二. 對單元格的進行設置
1. 單元格設置字體顏色和背景顏色 及字體字符
QTableWidgetItem *item = new QTableWidgetItem("Apple"); 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"));
2. 設置單元格內文字的對齊方式
這個比較簡單,使用newItem.setTextAlignment()函數即可,該函數的參數為單元格內的對齊方式,和字符輸入順序是自左相右還是自右向左。
水平對齊方式有:
Constant | Value | Description |
---|---|---|
Qt.AlignLeft | 0x0001 | Aligns with the left edge. |
Qt.AlignRight | 0x0002 | Aligns with the right edge. |
Qt.AlignHCenter | 0x0004 | Centers horizontally in the available space. |
Qt.AlignJustify | 0x0008 | Justifies the text in the available space. |
垂直對齊方式:
Constant | Value | Description |
---|---|---|
Qt.AlignTop | 0x0020 | Aligns with the top. |
Qt.AlignBottom | 0x0040 | Aligns with the bottom. |
Qt.AlignVCenter | 0x0080 | Centers vertically in the available space. |
如果兩種都要設置,只要用 Qt.AlignHCenter | Qt.AlignVCenter 的方式即可
3. 合並單元格效果的實現:
tableWidget->setSpan(0, 0, 3, 1) # 其參數為: 要改變單元格的 1行數 2列數 要合並的 3行數 4列數
4. 設置單元格的大小
首先,可以指定某個行或者列的大小
tableWidget->setColumnWidth(3,200); tableWidget->setRowHeight(3,60);
還可以將行和列的大小設為與內容相匹配
tableWidget->resizeColumnsToContents();
tableWidget->resizeRowsToContents();
5. 獲得單擊單元格的內容
通過實現 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.
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);//去掉自動滾動