Qt學記六: QTableWidget(表格控件)
一.QT的QTableWidget簡介
?QTabWidget是Qt中的表格組件。在窗體上,放一個QTabWidget,可以在Property Editor里對其進行屬性設置,雙擊這個組件,可以打開一個編輯器,對其Colum、row和Item進行編輯。
表格第一行稱為行表頭,用于設置每一列的標題,第一列稱為列表頭,可以設置其標題(行號),一般缺省。行表頭和列表頭一般是不可編輯的。每個網(wǎng)格單元稱為一個單元格。每個單元格有一個行號、列號。在QTableWidget表格中,每一個單元格是一個QTableWidgetItem對象,可以設置文字內(nèi)容、字體等。

二、QTableWidget設置行表頭

設置垂直方向的表頭,即行表頭
void QTableWidget::setHorizontalHeaderLabels(const QStringList &labels)
設置水平方向的表頭,即列表頭
void QStandardItemModel::setVerticalHeaderLabels(const QStringList &labels)
參數(shù):
QStringList &labels:list容器中保存QSstring(字符串)
設置前,要用setColumnCount(int columns)設置好表格的列數(shù),如下:

三、初始化表格數(shù)據(jù)
? ? 在初始化時,表格要確定好填入數(shù)據(jù)的行數(shù),即設置表格行。使用setRowCount確定表格的行數(shù):
void QTableWidget::setRowCount(int rows)
參數(shù):rows:表格行的行數(shù)目。
? ? 在表格中,一個單元格就是一個QTableWidgetItem對象。在初始化數(shù)據(jù)時,new QTableWidgetItem;即是創(chuàng)建出一個單元格,然后設置QTableWidgetItem的數(shù)據(jù)或者文本屬性等,再使用QTableWidget的setItem成員函數(shù)來將QTableWidgetItem添加到QTableWidget中。
1.QTableWidgetItem的構造函數(shù):?
QTableWidgetItem(const QString &text, int type = Type)
參數(shù):
text:QTableWidgetItem的文本內(nèi)容是text,即單元格的內(nèi)容是text;
type:類型

2.setItem:將QTableWidgetItem放入到QTableWidget的第row行第column列中。
void QTableWidget::setItem(int row, int column, QTableWidgetItem *item)
代碼使用如下:

四、QTableWidgetItem的屬性設置函數(shù)

五、獲取當前單元格的數(shù)據(jù)

使用currentCellChanged槽函數(shù),根據(jù)column,row來使用獲得QTableWidgetItem的單元格,然后用QTableWidgetItem的text方法獲得數(shù)據(jù)。下面的槽函數(shù)是可以獲得當前行的列的數(shù)據(jù),而上面的槽函數(shù)僅僅可以獲得當前單元格以及上一個單元格的數(shù)據(jù)。

六、插入、添加、刪除行

void QTableWidget::insertRow(int row);
void QTableWidget::removeRow(int row);
插入行,刪除行都要依靠row號,因此需要使用
int QTableWidget::currentRow() const函數(shù)獲得當前所在的行號
如下

七、自動調(diào)整行高和列寬

八、設置表格內(nèi)容是否可編輯


九、其他屬性設置
1.行、列表頭是否顯示

2.選擇模式

十、案列之程序界面:

十、案列之設置行表頭

十、案列之初始化數(shù)據(jù)


十、案列之插入加入行

主要代碼塊
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTableWidgetItem>
#include <QFileDialog>
#include <ActiveQt/QAxObject>
#include <QDesktopServices>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
? ?Q_OBJECT
public:
? ?MainWindow(QWidget *parent = nullptr);
? ?~MainWindow();
private slots:
? ?void on_SetHeader_clicked();
? ?void on_InitForm_clicked();
? ?void on_InsertRow_clicked();
? ?void on_AddRow_clicked();
? ?void on_DeleteRow_clicked();
? ?void on_AutoDesignPosti_clicked();
? ?void on_checkBox_clicked(bool checked);
? ?void on_ShowFormRowHeader_clicked(bool checked);
? ?void on_ShowFormColuHeader_stateChanged(int arg1);
? ?void on_ROwSelect_clicked();
? ?void on_CellSelect_clicked();
? ?void on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
private:
? ?Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
? ?: QMainWindow(parent)
? ?, ui(new Ui::MainWindow)
{
? ?ui->setupUi(this);
}
MainWindow::~MainWindow()
{
? ?delete ui;
}
void MainWindow::on_SetHeader_clicked()
{
? ?QTableWidgetItem *headerItem;
? ?QStringList headerText;
? ?headerText<<"姓名"<<"性別"<<"年齡"<<"是否是黨員"<<"new";
? ?ui->tableWidget->setColumnCount(headerText.count());
? ?//直接設置列表頭為headerText中的內(nèi)容
? //ui->tableWidget->setHorizontalHeaderLabels(headerText);
? ?//為每個行表頭的單元格設置屬性,通過setHorizontalHeaderItem將QTabWidgetItem,
? //將headerItem添加到列表頭只能。
? ?for(int i=0; i < ui->tableWidget->columnCount(); i++)
? ?{
? ? ? ?headerItem = new QTableWidgetItem(headerText.at(i));
? ? ? ?headerItem->setTextColor(Qt::blue);
? ? ? ?ui->tableWidget->setHorizontalHeaderItem(i,headerItem);
? ?}
}
//初始化數(shù)據(jù)
void MainWindow::on_InitForm_clicked()
{
? ?//只清除工作區(qū),不清除表頭
? ?ui->tableWidget->clearContents();
? ?//設置 表格的行數(shù)
? ?ui->tableWidget->setRowCount(2);
? ?QTableWidgetItem *item;
? ?// 新建一個單元格,數(shù)據(jù)為哥,在第0行第0列的單元格中
? ?item = new QTableWidgetItem("哥",1000);
? ?//設置單元格垂直、水平居中
? ?item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
? ?ui->tableWidget->setItem(0,0,item);
? ?item = new QTableWidgetItem("男",1000);
? ?item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
? ?ui->tableWidget->setItem(0,1,item);
? ?item = new QTableWidgetItem(QString::number(31),1001);
? ?item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
? ?ui->tableWidget->setItem(0,2,item);
? ?item = new QTableWidgetItem("是",1000);
? ?item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
? ?//設置單元格的勾選狀態(tài),會在單元格顯示QChexBox組件
? ?//Qt::Checked勾選狀態(tài),Qt::UnChecked不勾選狀態(tài)
? ?item->setCheckState(Qt::Checked);
? ?ui->tableWidget->setItem(0,3,item);
}
//插入行
void MainWindow::on_InsertRow_clicked()
{
? ?QTableWidgetItem *item;
? ?//獲取當前所在的行數(shù)
? ?int row = ui->tableWidget->currentRow();
? ?//不會自動創(chuàng)建QTableWidgetItem
? ?ui->tableWidget->insertRow(row);
? ?item = new QTableWidgetItem("新插入",1000);
? ?ui->tableWidget->setItem(row,0,item);
}
//加入行
void MainWindow::on_AddRow_clicked()
{
? ?QTableWidgetItem *item;
? ?//獲取當前所在的行數(shù)
? ?int row = ui->tableWidget->rowCount();
? ?//不會自動創(chuàng)建QTableWidgetItem
? ?ui->tableWidget->insertRow(row);
? ?item = new QTableWidgetItem("新加入",1000);
? ?ui->tableWidget->setItem(row,0,item);
}
//刪除行
void MainWindow::on_DeleteRow_clicked()
{
? ?int row = ui->tableWidget->currentRow();
? ?//刪除當前行以及Item
? ?ui->tableWidget->removeRow(row);
}
//自動調(diào)整
void MainWindow::on_AutoDesignPosti_clicked()
{
? ?//自動調(diào)整列寬,使其適應其內(nèi)容
? ?ui->tableWidget->resizeColumnsToContents();
? ?//自動調(diào)整行高,使其適應其內(nèi)容
? ?ui->tableWidget->resizeRowsToContents();
}
//是否可編輯
void MainWindow::on_checkBox_clicked(bool checked)
{
? ?if(checked)
? ?{
? ? ? ?//雙擊或獲取焦點單擊進入編輯模式
? ? ? ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|QAbstractItemView::SelectedClicked);
? ?}
? ?else
? ?{
? ? ? ?//不能編輯
? ? ? ?ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
? ?}
}
void MainWindow::on_ShowFormRowHeader_clicked(bool checked)
{ ? ?//是否顯示行表頭
? ?//verticalHeader()獲取行表頭,setvisible()設置是否可見,true可見
? ?ui->tableWidget->horizontalHeader()->setVisible(checked);
}
void MainWindow::on_ShowFormColuHeader_stateChanged(int arg1)
{
? ?//是否顯示列表頭
? ?//horizontalHeader()獲取列表頭,setvisible()設置是否可見,true可見
? ? ui->tableWidget->verticalHeader()->setVisible(arg1);
}
void MainWindow::on_ROwSelect_clicked()
{
? ?//設置選擇模式為行選擇模式
? ?ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
}
void MainWindow::on_CellSelect_clicked()
{
? ?//設置選擇模式為單元格選擇模式
? ?ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
}
//獲取單元格的數(shù)據(jù)
void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
{
? ?if(current == NULL)return;
? ?ui->CellFormData->setText(current->text());
}
謝謝閱讀,點個贊唄。

