Qt QTableWidget详解

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;                                      // 垂直滚动条 最顶端与最低端区域的背景色
}
  1. 设置单元格高度:
tableWidget->verticalHeader()->setDefaultSectionSize()

2.设置标题对齐方式

tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);

3.设置选择单元格 不出现虚线框(虚框)

tableWidget->setFocusPolicy(Qt::NoFocus);
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值