下面说一下表格的常用方法
行列数目、行表头、列表头
行表头:就是表格控件的第一行,用于设置每一列的标题
列表头:就是表格控件的第一列,用于设置每一行的标题,通常缺省则默认显示行号
设置和获取行列的数目
在添加行表头或者列表头或者n行或者n列数据之前,需要先把行设置为n或者列设置为n,开辟好空间,才能往表格里面填充数据
//获取行和列的数目
int rowCount() const
int columnCount() const
//设置行和列的数目
void setRowCount(int rows)
void setColumnCount(int columns)
比如
QTableWidget* t=new QTableWidget(this);
//设置表格为三行三列
t->setColumnCount(3);
t->setRowCount(3);
添加列表头和行表头
有两种方法:
- 一种是批量设置名称
//批量设置列表头
void QTableWidget::setHorizontalHeaderLabels(const QStringList &labels)
//批量设置行表头
void QTableWidget::setVerticalHeaderLabels(const QStringList &labels)
- 一种是单独设置某一列/行的名称
//单独设置某一列的名称
//参数1:哪一列
//参数2:具体的item,可在item里指定名称
void QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem *item)
//单独设置某一行的名称
void QTableWidget::setVerticalHeaderItem(int row, QTableWidgetItem *item)
比如:
t->setHorizontalHeaderLabels({"语文","数学"});//批量设置前两列的列名
t->setHorizontalHeaderItem(2,new QTableWidgetItem("英语"));//单独设置第三列的列名
t->setVerticalHeaderLabels({"王二","张三","李四"});//批量设置行的行名
添加数据
//参数1:哪一行
//参数2:哪一列
//参数3:具体的item
void QTableWidget::setItem(int row, int column, QTableWidgetItem *item)
//根据行号和列号来获取该单元格的item
QTableWidgetItem *QTableWidget::item(int row, int column) const
表格中每一个item对应的类是QTableWidgetItem,因此我们要先构造出item
比如
//插入第一行的数据
QTableWidgetItem* item00=new QTableWidgetItem("99");
t->setItem(0,0,item00);//插入到第一行第一列
t->setItem(0,1,new QTableWidgetItem("98"));//也可以直接new出来作为参数传进去
t->setItem(0,2,new QTableWidgetItem("97"));
t->setItem(0,3,new QTableWidgetItem("96"));
在同一个位置多次添加数据,则之前的item会自动被析构
添加带图片的数据
- 可以在构造item时,利用item的构造函数,指定图片
QTableWidgetItem* item10=new QTableWidgetItem(QIcon(":/11.jpg"),"99");//构造函数中指定图片
t->setItem(1,0,item10);//设置第二行第一列的数据
- 也可以数据添加完成后获取表格中对应的item ,然后利用QTableWidgetItem的setIcon方法来设置图片
同时QTableWidget的setIconSize方法还可以设置这些item里面的图片尺寸
t->item(0,0)->setIcon(QIcon(":/11.jpg"));//获取第一行第一列的item,然后设置图片
t->setIconSize(QSize(100,t->rowHeight(0)));//设置图片的高度和行高一样
添加QWidget
还可以让表格的格子显示一个QWidget,格子里QWidget的尺寸会随着格子的变化而变化,且填满整个格子
//参数1:哪一行
//参数2:哪一列
//参数3:要显示的QWidget
void QTableWidget::setCellWidget(int row, int column, QWidget *widget)
比如让格子显示一个QLabel
QLabel* lbl=new QLabel;
lbl->setPixmap(QPixmap(":/11.jpg"));//QLabel显示图片
lbl->setScaledContents(true);//图片随着QLabel的尺寸自动缩放
t->setCellWidget(2,0,lbl);//第三行第一列显示一个QLabel
插入数据
在插入一行或一列数据之前,我们要先插入一行空行或者空列来开辟空间,然后再填充数据
有两种:
- 一种是可以在任意行处添加一行/列
//在指定行号或者列号处插入一行空行或者空列
void QTableWidget::insertRow(int row)
void QTableWidget::insertColumn(int column)
其中头部插入一行,那么参数row就为0
尾部插入一行,那么参数row就为当前的行数量rowcount()
插入列同理
t->insertRow(0);//头部插入一行
t->insertRow(t->rowCount());//尾部插入一行
比如
尾部插入一行后,填充数据
t->insertRow(t->rowCount());//尾部插入一行
t->setItem(t->rowCount()-1,0,new QTableWidgetItem("96"));//填充插入的这一行的第一列的数据
- 一种是只能在尾部追加,可以追加一行/列或多行/列
通过setRow()/setColumn()来增加行和列的数量,然后再添加数据
比如:
//通过setRow开辟空间
t->setRowCount(t->rowCount()+1);//尾部增加一行
t->setRowCount(t->rowCount()+3);//尾部增加多行
删除数据
- 仅仅删除数据,不删除表格的行和列
[slot] void QTableWidget::clear()//删除表格里的所有内容
[slot] void QTableWidget::clearContents()//删除表格里的所有内容,除了行表头和列表的内容
比如:
删除表格里的所有内容
t->clear();
- 完全清空表格
即将行和列的数量都置为0
t->setRowCount(0);
t->setColumnCount(0);
- 删除指定的行或者列
//删除指定行或列的数据
void QTableWidget::removeRow(int row)
void QTableWidget::removeColumn(int column)
比如:
删除选择的行(版本1)
//1、先获取选择模型
QItemSelectionModel* s_m=t->selectionModel();
//2、通过选择模型获取到被选择项的模型索引
QModelIndexList s_list=s_m->selectedIndexes();
//获取所有被选中的行号并利用set去重(多选时会出现被选择的项都是同一行)
std::set < int > rows;
for (int i = 0; i < s_list.size(); ++i) {
rows.insert(s_list[i].row());
}
//将去重后的行号放到vector中来
std::vector vec(rows.begin(), rows.end());
//根据行号进行删除
for (int i = 0; i < vec.size(); ++i) {
//每次删除后就会减少1行,行号也要跟着发生改变
t -> removeRow(vec[i] - i);
}
删除选择的行(版本2)
//1、先获取选择模型
QItemSelectionModel* s_m=t->selectionModel();
//2、通过选择模型获取到被选择项的模型索引
QModelIndexList s_list=s_m->selectedIndexes();
while (true) {
//获取删除后最新的选择项
auto s_li = s_m -> selectedIndexes();
if (s_li.size() <= 0) //没有选择项了 证明删完了
{
break;
}
//每次只删除一行
t -> removeRow(s_li[0].row());
}
删除所选项
//1、先获取选择模型
QItemSelectionModel * s_m = t -> selectionModel();
//2、通过选择模型获取到被选择项的模型索引
QModelIndexList s_list = s_m -> selectedIndexes();
//3、删除所选项
for (const auto & itor: s_list) {
//有可能是空格子,要判断非空
if (t -> item(itor.row(), itor.column()) != nullptr) {
//删除对应位置的条目
delete(t -> item(itor.row(), itor.column()));
}
}
获取选中行或列(项)
和当前行或列(项)有区别,只有选中了表格中的某些数据,才能获取到选中行或列(项)
//获取选中的单元格,返回1个列表,可以有多个,但是不包含空项
QList<QTableWidgetItem *> QTableWidget::selectedItems() const
//获取选中的范围,QTableWidgetSelectionRange类提供方法可以获取到选中的行数,列数,开始行,结束行,开始列,结束列
QList<QTableWidgetSelectionRange> QTableWidget::selectedRanges() const
获取行表头和列表头
// 获取行表头
QHeaderView *horizontalHeader() const
// 获取列表头
QHeaderView *verticalHeader() const
获取某一行的行表头或者某一列的列表头
行表头或者列表头里面的每一项也是QTableWidgetItem
//获取某列的列表头
QTableWidgetItem *QTableWidget::horizontalHeaderItem(int column) const
//获取某行的行表头
QTableWidgetItem *QTableWidget::verticalHeaderItem(int row) const
隐藏行表头和列表头
[override virtual] void QHeaderView::setVisible(bool v)
获取到行表头和列表头之后调用它们的setVisible方法进行隐藏
比如
//隐藏行表头和列表头
t->verticalHeader()->setVisible(false);
t->horizontalHeader()->setVisible(false);
设置列宽
QHeaderView的方法
// 设置列的宽度 ,QHeaderView类的方法
void QHeaderView::setSectionResizeMode(QHeaderView::ResizeMode mode)
ResizeMode是枚举,有4种取值
QHeaderView::Interactive
:用户可拖动改变列宽QHeaderView::Fixed
:固定列宽QHeaderView::Stretch
:拉伸自适应列宽大小QHeaderView::ResizeToContents
:根据内容设置列宽
通常,我们将整体先设置为QHeaderView::Stretch,填满整个表格控件,然后根据需要对单独某一列设置列宽的模式
// 1、先整体设置为自适应宽度,再单独设置某一列的宽度规则
ui->twStudent->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 2、然后,单独设置第2列根据内容调整宽度,
ui->twStudent->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
//单独设置第一列为固定宽度
ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->twStudent->setColumnWidth(0, 80);
开启排序
void QTableView::setSortingEnabled(bool enable)
显示或隐藏排序箭头
//QHeaderView的方法
void setSortIndicatorShown(bool show)
先获取到列表头再设置排序箭头的显隐
t->horizontalHeader()->setSortIndicatorShown(true);
单元格对齐方式
是QTableWidgetItem类的方法
// 获取和设置单元格文本的对齐方式,是QTableWidgetItem类的方法
int textAlignment() const
void setTextAlignment(int alignment)
alignment取值
Qt::AlignLeft
水平方向-左对齐Qt::AlignRight
水平方向-右对齐Qt::AlignHCenter
水平方向-居中对齐Qt::AlignTop
垂直方向-上对齐Qt::AlignBottom
垂直方向-下对齐Qt::AlignVCenter
垂直方向-居中对齐Qt::AlignCenter
(AlignVCenter | AlignHCenter) 垂直方向和水平方向-居中对齐
单元格是否可编辑
// 获取和设置单元格是否可编辑
QAbstractItemView::EditTriggers editTriggers() const
void setEditTriggers(QAbstractItemView::EditTriggers triggers)
triggers取值
AbstractItemView::NoEditTriggers
不可编辑QAbstractItemView::CurrentChanged
当切换单元格时QAbstractItemView::DoubleClicked
当双击单元格时QAbstractItemView::SelectedClicked
当单击一个已选中的单元格时QAbstractItemView::EditKeyPressed
当一个单元格获取焦点,按编辑按键时(F2)QAbstractItemView::AnyKeyPressed
当一个单元格获取焦点,按任意键时QAbstractItemView::AllEditTriggers
以上所有条件的组合。(31 = 1|2|4|8|16)
隔行交替背景色
即奇数行和偶数行的背景色不同,便于用户浏览
// 获取和设置是否允许隔行交替背景色
bool alternatingRowColors() const
void setAlternatingRowColors(bool enable)
选择行为
即单击一个单元格时,是选中该单元格,还是选中一整行,或是一整列
// 获取和设置选择行为
QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
behavior有3种取值
QAbstractItemView::SelectItems
选中单元格QAbstractItemView::SelectRows
选中单元格所在行QAbstractItemView::SelectColumns
选中单元格所在列
选择模式
即表格控件只能选择单行,或者可以ctrl键或shift键一次性选择多行
// 获取和设置选择模式
QAbstractItemView::SelectionMode selectionMode() const
void setSelectionMode(QAbstractItemView::SelectionMode mode)
mode有5种取值
QAbstractItemView::NoSelection
不可选择QAbstractItemView::SingleSelection
单行选择,一次只允许选择一行QAbstractItemView::MultiSelection
多行选择,鼠标单击就可以选择多行QAbstractItemView::ExtendedSelection
扩展选择,按shift键选中一个范围内的行,ctrl键可以选中不相邻的行QAbstractItemView::ContiguousSelection
相邻选择,按shift键或ctrl键都可以选中一个范围内的行
开启左上角全选按钮
void setCornerButtonEnabled(bool enable
显示和隐藏网格线
void setShowGrid(bool show)
设置网格线的样式
void setGridStyle(Qt::PenStyle style)
显示和隐藏滚动条
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)//水平滚动条
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)//垂直滚动条
ScrollBarPolicy取值:
依次是:
需要时出现
总是关闭
总是打开
常用信号
表格的信号
//格子内容发生改变时发射
void cellChanged(int row, int column)
//格子被鼠标左键点击时发射
void cellClicked(int row, int column)
//格子被鼠标左键或者右键双击时发射
void cellDoubleClicked(int row, int column)
//鼠标进入到格子里时发射,表格需要开启鼠标追踪,空格子会发射,显示控件的格子有时候会发射,有时候不发射,qt自带的bug
void cellEntered(int row, int column)
//鼠标进入到格子里时发射,表格需要开启鼠标追踪,空格子和显示控件的格子不会发射
void itemEntered(QTableWidgetItem *item)
//选择的范围发生改变时发射
void itemSelectionChanged()
表头的信号
//属于QHeaderView的一些信号
//表头被点击
void sectionClicked(int logicalIndex)
样式表
/*表头的样式*/
QHeaderView::section{
background-color:pink;
color:white;
}
/*鼠标悬浮到表头的样式*/
QHeaderView::section:hover{
background-color:red;
color:black;
}
/*表头被选中的样式*/
QHeaderView::section:checked{
background-color:green;
color:white;
}
/*表格的样式*/
QTableWidget
{
background-color:yellow;
alternate-background-color:lightyellow;
outline:none;
}
/*表格项被选中的样式*/
QTableWidget::item:selected
{
background-color:red;
color:white;
}
/*鼠标悬浮到表格项上的样式*/
QTableWidget::item:hover{
background-color:orange;
color:blue;
}
举例
显示当前行
尾部添加一行
选中行前面插入一行
删除选中行
修改选中行
外观设置
选择模式设置
代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTableWidget>
#include<QHeaderView>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QGridLayout>
#include<QGroupBox>
#include<QLineEdit>
#include<QPushButton>
#include<QLabel>
#include<QCheckBox>
#include<QRadioButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr): QWidget(parent)
{
resize(800,500);
QHBoxLayout* main_layout=new QHBoxLayout(this);
/*************************初始化表格控件*******************************/
//创建表格,并初始化数据
table=new QTableWidget(this);
//设置为4列
table->setColumnCount(4);
//设置列宽自适应
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
//添加行表头
table->setHorizontalHeaderLabels({"姓名","性别","年龄","籍贯"});
//初始化2行数据
//要先设置行数,来开辟空间
table->setRowCount(2);
//要先构造出列表项
QTableWidgetItem* name1=new QTableWidgetItem("李雷");
QTableWidgetItem* gender1=new QTableWidgetItem("男");
QTableWidgetItem* age1=new QTableWidgetItem("12");
QTableWidgetItem* province1=new QTableWidgetItem("广东");
//设置居中对齐
name1->setTextAlignment(Qt::AlignCenter);
gender1->setTextAlignment(Qt::AlignCenter);
age1->setTextAlignment(Qt::AlignCenter);
province1->setTextAlignment(Qt::AlignCenter);
//然后填充单元格数据
table->setItem(0,0,name1);
table->setItem(0,1,gender1);
table->setItem(0,2,age1);
table->setItem(0,3,province1);
/********************************************************/
QTableWidgetItem* name2=new QTableWidgetItem("韩梅梅");
QTableWidgetItem* gender2=new QTableWidgetItem("女");
QTableWidgetItem* age2=new QTableWidgetItem("11");
QTableWidgetItem* province2=new QTableWidgetItem("北京");
name2->setTextAlignment(Qt::AlignCenter);
gender2->setTextAlignment(Qt::AlignCenter);
age2->setTextAlignment(Qt::AlignCenter);
province2->setTextAlignment(Qt::AlignCenter);
table->setItem(1,0,name2);
table->setItem(1,1,gender2);
table->setItem(1,2,age2);
table->setItem(1,3,province2);
main_layout->addWidget(table);
//初始化右边
QWidget* right=new QWidget(this);
main_layout->addWidget(right);
right->setFixedWidth(300);
QVBoxLayout* right_layout=new QVBoxLayout(right);
//数据操作部分
QGroupBox* group_box=new QGroupBox(this);
group_box->setTitle("数据操作");
right_layout->addWidget(group_box);
QGridLayout* group_box_layout=new QGridLayout(group_box);
name=new QLabel("姓名",this);
name_edit=new QLineEdit(this);
add=new QPushButton("添加一行",this);
group_box_layout->addWidget(name,0,0);
group_box_layout->addWidget(name_edit,0,1);
group_box_layout->addWidget(add,0,2);
gender=new QLabel("性别",this);
gender_edit=new QLineEdit(this);
insert=new QPushButton("插入一行",this);
group_box_layout->addWidget(gender,1,0);
group_box_layout->addWidget(gender_edit,1,1);
group_box_layout->addWidget(insert,1,2);
age=new QLabel("年龄",this);
age_edit=new QLineEdit(this);
del=new QPushButton("删除选中行",this);
group_box_layout->addWidget(age,2,0);
group_box_layout->addWidget(age_edit,2,1);
group_box_layout->addWidget(del,2,2);
province=new QLabel("籍贯",this);
province_edit=new QLineEdit(this);
mod=new QPushButton("修改选中行",this);
group_box_layout->addWidget(province,3,0);
group_box_layout->addWidget(province_edit,3,1);
group_box_layout->addWidget(mod,3,2);
group_box_layout->setVerticalSpacing(20);
QHBoxLayout* layout_1=new QHBoxLayout();
right_layout->addLayout(layout_1);
QGroupBox* outlooking_setting=new QGroupBox(this);
outlooking_setting->setTitle("外观设置");
QVBoxLayout* layout_2=new QVBoxLayout(outlooking_setting);
layout_1->addWidget(outlooking_setting);
QCheckBox* row_head=new QCheckBox("行表头",this);
QCheckBox* col_head=new QCheckBox("列表头",this);
QCheckBox* alter_back_color=new QCheckBox("交替背景色",this);
QCheckBox* editable=new QCheckBox("单元格可编辑",this);
QCheckBox* style_sheet=new QCheckBox("设置样式表",this);
layout_2->addWidget(row_head);
layout_2->addWidget(col_head);
layout_2->addWidget(alter_back_color);
layout_2->addWidget(editable);
layout_2->addWidget(style_sheet);
//初始化复选框的选中状态
row_head->setChecked(table->horizontalHeader()->isHidden()?false:true);
col_head->setChecked(table->verticalHeader()->isHidden()?false:true);
alter_back_color->setChecked(table->alternatingRowColors()?true:false);
//如果为NoEditTriggers则表示单元格不可编辑
editable->setChecked(table->editTriggers()==QAbstractItemView::NoEditTriggers?false:true);
QGroupBox* select_setting=new QGroupBox(this);
select_setting->setTitle("选择设置");
layout_1->addWidget(select_setting);
QVBoxLayout* layout_3=new QVBoxLayout(select_setting);
QRadioButton* select_single=new QRadioButton("选择单元格",this);
QRadioButton* select_one_row=new QRadioButton("选择行",this);
layout_3->addWidget(select_single);
layout_3->addWidget(select_one_row);
//初始化单选按钮的选中状态
int select_mode=table->selectionBehavior();
if(select_mode==QAbstractItemView::SelectItems)
{
select_single->setChecked(true);
}
else if(select_mode==QAbstractItemView::SelectRows)
{
select_one_row->setChecked(true);
}
//将当前选中的行显示到编辑框中
//绑定QTableWidget的itemClicked信号
connect(table,&QTableWidget::itemClicked,this,[=](QTableWidgetItem* item){
//获取到当前选中的行,下面两种方法都可
//int cur_row=table->currentRow();
int cur_row=item->row();
//获取当前行中每一个item
name_edit->setText(table->item(cur_row,0)->text());
gender_edit->setText(table->item(cur_row,1)->text());
age_edit->setText(table->item(cur_row,2)->text());
province_edit->setText(table->item(cur_row,3)->text());
});
//尾部添加一行
connect(add,&QPushButton::clicked,this,[=](){
//在添加之前,我们要先获取行数,把行数+1,开辟空间
//如果添加n行,那么要先把行数+n
int row=table->rowCount();
table->setRowCount(row+1);
QTableWidgetItem* name_item=new QTableWidgetItem(name_edit->text());
QTableWidgetItem* gender_item=new QTableWidgetItem(gender_edit->text());
QTableWidgetItem* age_item=new QTableWidgetItem(age_edit->text());
QTableWidgetItem* province_item=new QTableWidgetItem(province_edit->text());
//设置居中对齐
name_item->setTextAlignment(Qt::AlignCenter);
gender_item->setTextAlignment(Qt::AlignCenter);
age_item->setTextAlignment(Qt::AlignCenter);
province_item->setTextAlignment(Qt::AlignCenter);
//行数的索引是从0开始的,所以新增行的索引就是row
//填充单元格数据
table->setItem(row,0,name_item);
table->setItem(row,1,gender_item);
table->setItem(row,2,age_item);
table->setItem(row,3,province_item);
});
//当前行之前插入一行
connect(insert,&QPushButton::clicked,this,[=](){
//获取所有选中项
auto select_items=table->selectedItems();
if(select_items.empty())
{
//为空,证明没有选中
return;
}
//只获取第一个选中项的行号
int cur_row=select_items[0]->row();
//在选中项前插入一行
table->insertRow(cur_row);
QTableWidgetItem* name_item=new QTableWidgetItem(name_edit->text());
QTableWidgetItem* gender_item=new QTableWidgetItem(gender_edit->text());
QTableWidgetItem* age_item=new QTableWidgetItem(age_edit->text());
QTableWidgetItem* province_item=new QTableWidgetItem(province_edit->text());
//设置居中对齐
name_item->setTextAlignment(Qt::AlignCenter);
gender_item->setTextAlignment(Qt::AlignCenter);
age_item->setTextAlignment(Qt::AlignCenter);
province_item->setTextAlignment(Qt::AlignCenter);
//填充单元格数据
table->setItem(cur_row,0,name_item);
table->setItem(cur_row,1,gender_item);
table->setItem(cur_row,2,age_item);
table->setItem(cur_row,3,province_item);
});
//删除选中行
connect(del,&QPushButton::clicked,this,[=](){
//获取所有选中项
auto select_items=table->selectedItems();
if(select_items.empty())
{
//为空,证明没有选中
return;
}
//只获取第一个选中项的行号
int cur_row=select_items[0]->row();
//删除选中行
table->removeRow(cur_row);
});
//修改选中行
connect(mod,&QPushButton::clicked,this,[=](){
//获取所有选中项
auto select_items=table->selectedItems();
if(select_items.empty())
{
//为空,证明没有选中
return;
}
//只获取第一个选中项的行号
int cur_row=select_items[0]->row();
//修改单元格数据
table->item(cur_row,0)->setText(name_edit->text());
table->item(cur_row,1)->setText(gender_edit->text());
table->item(cur_row,2)->setText(age_edit->text());
table->item(cur_row,3)->setText(province_edit->text());
});
//是否显示行表头
connect(row_head,&QCheckBox::clicked,this,[=](){
if(row_head->isChecked())
{
//选中后显示行表头
table->horizontalHeader()->show();
}
else
{
//未选中则隐藏行表头
table->horizontalHeader()->hide();
}
});
//是否显示列表头
connect(col_head,&QCheckBox::clicked,this,[=](){
if(col_head->isChecked())
{
table->verticalHeader()->show();
}
else
{
table->verticalHeader()->hide();
}
});
//是否交替切换行背景色
connect(alter_back_color,&QCheckBox::clicked,this,[=](){
if(alter_back_color->isChecked())
{
//win11该接口失效
table->setAlternatingRowColors(true);
}
else
{
table->setAlternatingRowColors(false);
}
});
//单元格是否可编辑
connect(editable,&QCheckBox::clicked,this,[=](){
if(editable->isChecked())
{
//双击、选中后单击、选中后按F2键都可编辑单元格
table->setEditTriggers(QAbstractItemView::DoubleClicked |
QAbstractItemView::SelectedClicked |
QAbstractItemView::EditKeyPressed);
}
else
{
table->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
});
//设置样式表
connect(style_sheet,&QCheckBox::clicked,this,[=](){
if(style_sheet->isChecked())
{
//单元格的样式
QString cellStyle = R"(
QTableView
{
text-align:center;
background-color: rgba(255, 255, 255, 0);
alternate-background-color:#e3edf9;
font:14px "微软雅黑";
color:#677483;
gridline-color: #ccddf0;
}
)";
//行表头的样式
const QString horizontalHeaderStyle = R"(
QHeaderView::section {
color: black;
font:bold 14px "微软雅黑";
text-align:center;
height:32px;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
)";
//列表头的样式
const QString verticalHeaderStyle = R"(
QHeaderView::section {
color: black;
font:bold 14px "微软雅黑";
width:60px;
text-align:center;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
)";
table->setStyleSheet(cellStyle);
table->horizontalHeader()->setStyleSheet(horizontalHeaderStyle);
table->verticalHeader()->setStyleSheet(verticalHeaderStyle);
}
else
{
table->setStyleSheet("");
table->horizontalHeader()->setStyleSheet("");
table->verticalHeader()->setStyleSheet("");
}
});
//设置鼠标点击时只选中单元格
connect(select_single,&QRadioButton::clicked,this,[=](){
if(select_single->isChecked())
{
table->setSelectionBehavior(QAbstractItemView::SelectItems);
}
});
//设置鼠标点击时选中一整行
connect(select_one_row,&QRadioButton::clicked,this,[=](){
if(select_one_row->isChecked())
{
table->setSelectionBehavior(QAbstractItemView::SelectRows);
}
});
}
~Widget()=default;
private:
QTableWidget* table;
//数据操作
QLabel* name;
QLineEdit* name_edit;
QPushButton* add;
QLabel* gender;
QLineEdit* gender_edit;
QPushButton* insert;
QLabel* age;
QLineEdit* age_edit;
QPushButton* del;
QLabel* province;
QLineEdit* province_edit;
QPushButton* mod;
};
#endif // WIDGET_H
学习链接:https://github.com/0voice