#QTableWidget操作
Bug
1.当QTableWidget没有初始化完成,就获取不到表格的width,此时设置获取表格宽度或者列宽都不正确
2.QTableWidget在TabWidget 中时,需要TabWidget ->setCurrentIndex(i); 此QTableWidget在i这个页面中,才会初始化,否则还是获取不到表格width!!!
设置表格行列
tablewidget->setColumnCount(4);//设置表格列
tablewidget->setRowCount(4);//设置表格行
指定列宽、行高
tableWidget->setColumnWidth(3,200);
tableWidget->setRowHeight(3,60);
添加一行
int row = tableWidget->rowCount();//获取表格中当前总行数
tableWidget->setRowCount(row+1);//加一
清空表格
方法1:
tableWidget->setRowCount(0);
方法2
for (int k = tableWidget->rowCount() - 1; k >= 0; k--)
tableWidget->removeRow(k);
删除某一行
tablewidget->removeRow(row);//int
设置无边框
tableWidget->setFrameShape(QFrame::NoFrame);
设置不显示格子线
tableWidget->setShowGrid(false);
去除选中虚线框
tableWidget->setFocusPolicy(Qt::NoFocus);
设置表头内容
QStringList header;
header<<tr("value")<<tr("value")<<tr("value");
tableWidget->setHorizontalHeaderLabels(header);
设置表头背景色
tableWidget_projectList->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");
隐藏行、列表头
(展示或隐藏表格每行默认的行号)
//隐藏列表头
tableWidget->verticalHeader()->setVisible(false);
//隐藏行表头
tableWidget->horizontalHeader()->setVisible(false);
表头字体加粗
QFont font; font.setBold(true);
tableWidget->horizontalHeader()->setFont(font);
指定隐藏的列
tableWidget->hideColumn(0);
双击单元格信号
connect(tableWidget, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(OnDBdoubleClicked(int, int)));
设置为可以选中多个目标
tableWidget>setSelectionMode(QAbstractItemView::ExtendedSelection);
//QAbstractItemView::NoSelection 不能选择
//QAbstractItemView::SingleSelection 选中单个目标
//QAbstractItemView::MultiSelection 选中多个目标
选中一行
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
//QAbstractItemView::SelectItems 0 Selecting single items.选中单个单元格
//QAbstractItemView::SelectRows 1 Selecting only rows.选中一行
//QAbstractItemView::SelectColumns 2 Selecting only columns.选中一列
滚动条
ui->tableWidget->scrollToBottom(); //让滚动条滚动到最底部
ui->tableWidget->scrollToTop(); //让滚动条滚动到最顶部
表格为只读模式
tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//表格为可更改模式
tableWidget->setEditTriggers(QAbstractItemView::AllEditTriggers);//表格全部可修改
//QAbstractItemView::NoEditTriggers 0 不能对表格内容进行修改
//QAbstractItemView::CurrentChanged 1 任何时候都能对单元格修改
//QAbstractItemView::DoubleClicked 2 双击单元格
//QAbstractItemView::SelectedClicked 4 单击已选中的内容
//QAbstractItemView::EditKeyPressed 8 Editing starts when the platform edit key has been pressed over an item.
//QAbstractItemView::AnyKeyPressed 16 按下任意键就能修改
//QAbstractItemView::AllEditTriggers 31 以上条件全包括
单元格不可被选中
item->setFlags(item->flags()&~Qt::ItemIsSelectable);
更改表格单元格内容 信号
connect(tableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(OnChange(int, int)));
表格插入勾选框
auto check = new QTableWidgetItem();
check->setCheckState(Qt::Checked);//check->setCheckState(Qt::Unchecked);
check->setFlags(check->flags()&(~Qt::ItemIsEditable));//设置该勾选框这一列不能输入值
tableWidget->setItem(rowCount, 0, check);
表格插入普通单元格:单元格带不同属性
QTableWidgetItem *newItems = new QTableWidgetItem(data);//data为单元格内容
if (isBool)//是否加粗
{
QFont font; font.setBold(true);
newItems->setFont(font);
}
if (!isEnable)//单元格不可编辑
newItems->setFlags(newItems->flags()&(~Qt::ItemIsEditable));
tableWidget->setItem(row, col, newItems);
表格插入:普通单元格(无属性设置)
tablewidget->setItem(row,col, new QTableWidgetItem(data));//data为字符串
//表格插入:按钮
QPushButton *button = new QPushButton(QStringLiteral("按钮"));
connect(button, &QPushButton::clicked, this, &CenterWnd::OnShow);
tableWidget->setCellWidget(row, col, button);
表格插入:按钮 按钮槽事件
QPushButton *line = dynamic_cast<QPushButton*>(QObject::sender());
QModelIndex index = tableWidget->indexAt(line->pos());
int row = index.row();//当前按钮所在行列
int col = index.column();
获取单元格内容
QString data = tableWidget->item(row, col)->text();
//获取单元格内容:若tableWidget->item(row, col)不存在该单元格,则会中断,最好先判断一下该单元格是否存在
if (item)
return item->text();
合并单元格
tableWidget->setSpan(0, 0, 3, 1) # 其参数为: 开始行,开始列,行数,列数
记录滚动条
QScrollBar *scrolBar_;
scrolBar_ = tableWidget->verticalScrollBar();
int scrolBar_Pos_; //当前行 所在位置
scrolBar_Pos_ = scrolBar_->value();
scrolBar_->setValue(scrolBar_Pos_);//返回原来位置
右键菜单
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置菜单项显示方式:右键会发送信号,还会捕捉到右键位置,并用pos存储
connect(tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(OnDBMenu(QPoint)));
// 右键菜单:捕捉到右键信号
void OnDBMenu(QPoint pos)
{
QMenu *MenuDB = new QMenu(this);//初始化菜单
QAction *ction_delete = new QAction(QStringLiteral("删除"), this);
QAction *action_change = new QAction(QStringLiteral("修改"), this);
connect(ction_delete, SIGNAL(triggered()), this, SLOT(OnDelete()));
connect(action_change, SIGNAL(triggered()), this, SLOT(OnChange()));
MenuDB->addAction(action_change);
MenuDB->addAction(ction_delete);
MenuDB->exec(QCursor::pos());//通过exec在pos()位置显示该菜单,pos()返回位置
}
排序:设置按照某列排序
QHeaderView *header = tableWidget->horizontalHeader();
header->setSortIndicator(0, Qt::AscendingOrder);
header->setSortIndicatorShown(true);
排序:点击表头,触发槽函数,根据选中点击的那一列排序
connect(tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(record_sortbycolunm(int)));
void BasicInfoUI::record_sortbycolunm(int col)
{
tableWidget->sortItems(col, Qt::AscendingOrder);
}
设置表格 列 样式:指定列
必须是表格初始化完成后使用才有效果
for (int i = begincol; i <= lastcol; i++)
{
if (mode == 0)//设置要根据内容使用宽度的列,会出现滚动条
table->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents);
else if (mode == 1)//自动调整大小,填充可用空间,屏幕不够大时自动缩小,不会出现滚动条
table->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Stretch);
else if (mode == 2)//用户无法调整表格列的宽度
table->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Fixed);
}
设置表格 列 样式:不指定列
必须是表格初始化完成后使用才有效果
if (mode == 0)//设置要根据内容使用宽度的列,会出现滚动条
table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
else if (mode == 1)//自动调整大小,填充可用空间,屏幕不够大时自动缩小,不会出现滚动条
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
else if (mode == 2)//用户无法调整表格列的宽度
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);//可手动拖拉列宽,可配合上面几种一起使用
表格单元格增加代理(详见QComBox 和 QLineEdit 代理笔记QItemDelegate):QLineEdit
QLineEdit *lineEdit = new QLineEdit();
lineEdit->setStyleSheet("border:none");
lineEdit->setText(data);
tableWidget->setCellWidget(row, col, lineEdit);
setRegExpNum(lineEdit, editModel);
if (!isEnable)//不可编辑
lineEdit->setEnabled(false);
if (isBool)//是否加粗
{
QFont font; font.setBold(true);
lineEdit->setFont(font);
}
表格单元格增加代理:QLineEdit值更改发出信号
void OnChangeItemLineEdit(const QString &string)
{
QLineEdit *line = dynamic_cast<QLineEdit*>(QObject::sender());
QModelIndex index = ui_.tableWidget_GYLC->indexAt(line->pos());
int row = index.row();
int col = index.column();
OnChangeTable(row, col);
}