Qt学记六: QTableWidget(表格控件)
一.QT的QTableWidget简介
QTabWidget是Qt中的表格组件。在窗体上,放一个QTabWidget,可以在Property Editor里对其进行属性设置,双击这个组件,可以打开一个编辑器,对其Colum、row和Item进行编辑。
表格第一行称为行表头,用于设置每一列的标题,第一列称为列表头,可以设置其标题(行号),一般缺省。行表头和列表头一般是不可编辑的。每个网格单元称为一个单元格。每个单元格有一个行号、列号。在QTableWidget表格中,每一个单元格是一个QTableWidgetItem对象,可以设置文字内容、字体等。

二、QTableWidget设置行表头

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

三、初始化表格数据
在初始化时,表格要确定好填入数据的行数,即设置表格行。使用setRowCount确定表格的行数:
void QTableWidget::setRowCount(int rows)
参数:rows:表格行的行数目。
在表格中,一个单元格就是一个QTableWidgetItem对象。在初始化数据时,new QTableWidgetItem;即是创建出一个单元格,然后设置QTableWidgetItem的数据或者文本属性等,再使用QTableWidget的setItem成员函数来将QTableWidgetItem添加到QTableWidget中。
1.QTableWidgetItem的构造函数:
QTableWidgetItem(const QString &text, int type = Type)
参数:
text:QTableWidgetItem的文本内容是text,即单元格的内容是text;
type:类型

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

四、QTableWidgetItem的属性设置函数

五、获取当前单元格的数据

使用currentCellChanged槽函数,根据column,row来使用获得QTableWidgetItem的单元格,然后用QTableWidgetItem的text方法获得数据。下面的槽函数是可以获得当前行的列的数据,而上面的槽函数仅仅可以获得当前单元格以及上一个单元格的数据。

六、插入、添加、删除行

void QTableWidget::insertRow(int row);
void QTableWidget::removeRow(int row);
插入行,删除行都要依靠row号,因此需要使用
int QTableWidget::currentRow() const函数获得当前所在的行号
如下

七、自动调整行高和列宽

八、设置表格内容是否可编辑


九、其他属性设置
1.行、列表头是否显示

2.选择模式

十、案列之程序界面:

十、案列之设置行表头

十、案列之初始化数据


十、案列之插入加入行

主要代码块
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中的内容
//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);
}
}
//初始化数据
void MainWindow::on_InitForm_clicked()
{
//只清除工作区,不清除表头
ui->tableWidget->clearContents();
//设置 表格的行数
ui->tableWidget->setRowCount(2);
QTableWidgetItem *item;
// 新建一个单元格,数据为哥,在第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);
//设置单元格的勾选状态,会在单元格显示QChexBox组件
//Qt::Checked勾选状态,Qt::UnChecked不勾选状态
item->setCheckState(Qt::Checked);
ui->tableWidget->setItem(0,3,item);
}
//插入行
void MainWindow::on_InsertRow_clicked()
{
QTableWidgetItem *item;
//获取当前所在的行数
int row = ui->tableWidget->currentRow();
//不会自动创建QTableWidgetItem
ui->tableWidget->insertRow(row);
item = new QTableWidgetItem("新插入",1000);
ui->tableWidget->setItem(row,0,item);
}
//加入行
void MainWindow::on_AddRow_clicked()
{
QTableWidgetItem *item;
//获取当前所在的行数
int row = ui->tableWidget->rowCount();
//不会自动创建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);
}
//自动调整
void MainWindow::on_AutoDesignPosti_clicked()
{
//自动调整列宽,使其适应其内容
ui->tableWidget->resizeColumnsToContents();
//自动调整行高,使其适应其内容
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);
}
//获取单元格的数据
void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
{
if(current == NULL)return;
ui->CellFormData->setText(current->text());
}
谢谢阅读,点个赞呗。

