QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC、C#中的DataGrid。说到QTableWidget,就必须讲一下它跟QTabelView的区别了。
QTableWidget是QTableView的子类,主要的区别是QTableView可以使用自定义的数据模型来显示内容(也就是先要通过setModel来绑定数据源),而QTableWidget则只能使用标准的数据模型,并且其单元格数据是QTableWidgetItem的对象来实现的(也就是不需要数据源,将逐个单元格内的信息填好即可)。这主要体现在QTableView类中有setModel成员函数,而到了QTableWidget类中,该成员函数变成了私有。使用QTableWidget就离不开QTableWidgetItem。QTableWidgetItem用来表示表格中的一个单元格,整个表格都需要用逐个单元格构建起来。
一、常用属性(可设计器直接设置)
函数 | 作用 |
---|---|
void setVisible(bool v) | 设置水平或垂直方向的表头是否显示 |
void setCascadingSectionResizes(bool enable) | 当用户调整的区域大小达到其最小值时,是否将大小调整调整级联到后继下一区域 |
void setDefaultSectionSize(int size) | 设置默认大小 |
setHighlightSections | 设置点击单元格时,表头项是否高亮 |
void setStretchLastSection(bool stretch) | 设置最后一项是否拉伸到整个宽度 |
void setMinimumSectionSize(int size) | 设置最小尺寸 |
void setSortIndicator(int logicalIndex, Qt::SortOrder order) | 设置排序 |
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy) | 设置水平方向滚动条策略,垂直方向同理,可设置显示或不显示 |
void setSelectionMode(QAbstractItemView::SelectionMode mode) | 设置选择模式(单选、多选) |
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) | 选中一行,或是选中一列 |
void setCornerButtonEnabled(bool enable) | 设置是否可以点击左上角进行全选 ,注意水平、垂直表头都显示时才可以 |
void setShowGrid(bool show) | 设置是否显示网格线 |
void setGridStyle(Qt::PenStyle style) | 设置显示网格线的样式 |
void setSortingEnabled(bool enable) | 设置点击表头进行排序 |
二、常用方法
1. 清空单元格里面的内容
void clear() | 清空单元格里面的内容,但是网格还在,表头也在
2. 清空所有标题和内容
//显示的网格也会被删除
ui.tableWidget->setColumnCount(0);
ui.tableWidget->setRowCount(0);
3. 插入标题
//新增或修改水平标题
ui.tableWidget->setColumnCount(5); //设置列数
ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromLocal8Bit("新增列001")));
ui.tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem);
ui.tableWidget->horizontalHeaderItem(1)->setText(QString::fromLocal8Bit("新增列002"));
//可以一次设置一组标题
void setHorizontalHeaderLabels(const QStringList &labels);
4. 设置指定宽度
//设置指定列的宽度,同理可设置指定行的宽度
void setColumnWidth(int column, int width);
5. 插入数据
方法一:先设置行数和列数,然后插入数据
void setColumnCount(int columns); //设置列数
void setRowCount(int rows); //设置行数
void setItem(int row, int column, QTableWidgetItem *item); //设置单元格内容
方法二:先插入一行(尾部插入),然后插入数据
int row = ui.tableWidget->rowCount(); //获取行数
ui.tableWidget->insertRow(row); //插入一行 插入的一行是一个空行
void setItem(int row, int column, QTableWidgetItem *item); //设置单元格内容
开始位置插入一行
ui.tableWidget->insertRow(0); //插入一行
void setItem(int row, int column, QTableWidgetItem *item); //设置单元格内容
6. 插入QIcont图片
ui.tableWidget->item(row, 0)->setIcon(QIcon(":/QtWidgetsApplication1/Resources/timg.gif"));
7. 设置/获取行高
void setRowHeight(int row, int height);
int rowHeight(int row) const;
8. 设置图标尺寸
void setIconSize(const QSize &size);
9. 插入widget图片
QLabel *pLabel = new QLabel;
QPixmap pix(":/QtWidgetsApplication1/Resources/timg.gif");
//缩放到和表格单元的宽高一致
pix = pix.scaled(ui.tableWidget->columnWidth(0), ui.tableWidget->rowHeight(row));
pLabel->setPixmap(pix);
ui.tableWidget->setCellWidget(row, 0, pLabel);
10. 删除一行或多行
注意:方法一,空行不会被选中,所以不会被删除
QList<QTableWidgetItem*> items = ui.tableWidget->selectedItems(); //如果是空行,则不会被选中
for (const auto &it : items) //获取的是被选中的item,所以会有多个(如果是单行或是多行选中模式),此时需要去重复索引
{
//ui.tableWidget->removeRow(it->row() );
qDebug() << it->row() << " : " << it->column() << "=" << it->text() << endl;
}
方法二:空行会被选择到,会被删除
//选择模式器
QItemSelectionModel * model = ui.tableWidget->selectionModel();
//获取所有选择的索引
QModelIndexList indexList = model->selectedIndexes();
//获取所有被选中的行号
for (const auto &it : indexList) //删除时应该注意去重复行号
{
//ui.tableWidget->removeRow(it.row());
qDebug() << it.row() << " : " << it.column() << "=" << endl;
}
11.获取水平或垂直方向上的表头
QHeaderView *horizontalHeader() const;
QHeaderView *verticalHeader() const;
三、信号事件
1. 常用信号
信号 | 说明 |
---|---|
void itemEntered(QTableWidgetItem *item); | 鼠标移上去 要打开鼠标跟踪事件(setMouseTracking(true)),自定义widget无效,如果是空的item,不会触发此信号 |
void itemChanged(QTableWidgetItem *item); | 单元格发生改变 |
void cellEntered(int row, int column); | 鼠标移上去 要打开鼠标跟踪事件(setMouseTracking(true)),如果是空的item,会触发此信号 |
void cellChanged(int row, int column); | 单元格发生改变 |
void cellClicked(int row, int column); | 鼠标单击事件,空行也可触发,只能鼠标左键点击 |
void cellDoubleClicked(int row, int column); | 鼠标双击事件,空行也可触发,鼠标左键或右键双击 |
void itemClicked(QTableWidgetItem *item); | 鼠标单击事件,空行不会触发,只能鼠标左键点击 |
void itemDoubleClicked(QTableWidgetItem *item); | 鼠标双击事件,空行不会触发,鼠标左键或右键双击 |
还有很多常用的信号,就不全都列举出来了,可自行查询Qt源码。。。
2. 标题栏点击信号
connect(ui.tableWidget->horizontalHeader(), &QHeaderView::sectionClicked, [=](int col) {
qDebug() << col << " : " << ui.tableWidget->horizontalHeaderItem(col)->text()<< endl;
});
获取水平或垂直方向上的表头以后,可以查看里面的很多信号,通过相关信号可以设置点击表头排序,或设置表头字体加粗等属性。相关属性自行查询Qt源码即可。
四、样式设置
QHeaderView // QTableWidget 标题头整个区域
{
background:transparent; // 整个标题头区域背景色
}
QHeaderView::section // 标题头 每个单独的标题区域
{
font-size:14px; // 每个标题的字体大小
font-family:"Microsoft YaHei"; // 每个标题的字体类型
color:#FFFFFF; // 每个标题的字体颜色
background:#60669B; // 每个标题区域的背景色
border:none; // 每个标题区域的边框
text-align:left; // 每个标题的对齐方式(貌似不能用)。建议使用tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter)
min-height:49px; // 标题区域的高度
max-height:49px; //
margin-left:0px; // 每个标题区域的margin
padding-left:0px; // 每个标题区域的padding
}
QHeaderView::section:checked // 标题头 选中的状态
{}
QTableWidget // 整个表格控件
{
background:#FFFFFF; // 整个表格控件 背景色
border:none; // 整个表格控件 边框
gridline-color: $border; /*表格中的网格线条颜色*/
/*设置交替颜色,需要在函数属性中设置:tableWidget->setAlternatingRowColors(true)*/
alternate-background-color: $grad1a;
/*selection-color:$background; 鼠标选中时前景色:文字颜色*/
selection-background-color:$selected; /*鼠标选中时背景色*/
border:1px solid $border; /*边框线的宽度、颜色*/
/*border:none; 去除边界线*/
/*border-radius:5px;*/
/*padding:10px 10px;*/ /*表格与边框的间距*/
font-size:12px; // 所有字体大小
font-family:"Microsoft YaHei"; // 所有字体 family
color:#666666; // 所有字体颜色
}
QTableWidget::item // 每个单元格
{
border-bottom:1px solid #EEF1F7 ; // 只显示每个单元格下边框
}
QTableWidget::item::selected // 每个单元格被选中状态
{
color:red; // 每个单元格被选中时 字体颜色
background:#EFF4FF; // 每个单元格被选中时 背景颜色
}
QScrollBar::handle:vertical // 垂直滚动条 handle
{
background: rgba(255,255,255,20%); // 垂直滚动条 handle 的背景色
border: 0px solid grey; // 垂直滚动条 handle 边框
border-radius:3px; // 垂直滚动条 handle 圆角
width: 8px; // 垂直滚动条 handle 宽度
}
QScrollBar::vertical // 垂直滚动条 区域
{
border-width:1px; // 垂直滚动条 区域 边框宽度
border-style: solid; // 垂直滚动条 区域 边框类型
border-color: rgba(255, 255, 255, 10%); // 垂直滚动条 区域 边框颜色
width: 8px; // 垂直滚动条 区域 宽度
margin:0px 0px 0px 0px; // 垂直滚动条 区域 margin
border-radius:3px; // 垂直滚动条 区域 圆角
}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical // 垂直滚动条 handle上、下区域(未被handle占用的区域)
{
background:rgba(255,255,255,10%); // 垂直滚动条 handle上、下区域的背景色
}
QScollBar::add-line:vertical, QScrollBar::sub-line:vertical // 垂直滚动条 最顶端与最低端的区域
{
background:transparent; // 垂直滚动条 最顶端与最低端区域的背景色
}
- 设置单元格高度:
tableWidget->verticalHeader()->setDefaultSectionSize()
2.设置标题对齐方式
tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
3.设置选择单元格 不出现虚线框(虚框)
tableWidget->setFocusPolicy(Qt::NoFocus);