Qt基础-QTableView、QTableWidget用法
QTableView与QTableWidget的区别
- QTableView可以使用setModel设置模型,QTableWidget不可以;
关于QTableView与QStandardItemModel的tips
- 与整体显示相关的,用QTableView设置,如设置编辑模式
- 与某一项数据相关的,用QStandardItemModel设置,如设置某一项的底色
功能
QTableView的对象为ui.tableView,QStandardItemModel的对象为m_itemModel;
- 设置数据模型
QStandardItemModel m_itemModel= new QStandardItemModel();
ui.tableView->setModel(m_itemModel);
与数据相关的操作
- 添加一行数据
QList<QStandardItem *> itemList;
itemList.append(new QStandardItem("-1"));
itemList.append(new QStandardItem("-1"));
itemList.append(new QStandardItem("-1"));
itemList.append(new QStandardItem("-1"));
m_itemModel->appendRow(itemList);
- 删除一行数据
m_itemModel->removeRow(1);
- 设置某一项数据
m_itemModel->setData(m_itemModel->index(0, 2), "RGB");
- 选择某一行
ui.tableView->selectRow(0);
- 设置编辑模式
ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //不可编辑
- 清空数据
m_itemModel->clear(); //注意:清空后再添加数据,列宽会恢复到初始状态
与外观显示相关的操作
表格数据
- 设置列宽度
ui.tableView->setColumnWidth(0, 100); //设置第1列宽度为100
- 最后一列填充空白
ui.tableWidget->horizontalHeader()->setStretchLastSection(true);
- 选中数据时选择整行
ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选择行
- 一次只能选择一行
ui.tableView->setSelectionMode(QAbstractItemView::SingleSelection); //一次只能选择一行
- 设置焦点显示模式
ui.tableView->setFocusPolicy(Qt::NoFocus); //设置无焦点,鼠标选中不会显示虚线框
- 设置选中项的背景颜色
ui.tableView->setStyleSheet("selection-background-color:rgb(100,200,200)");
- 设置表格线
ui.tableView->setShowGrid(false); //不显示网格线
滚动条
- 设置滚动条(不)显示
//设置不显示竖直滚动条
ui.tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- 判断竖直滚动条是否出现,并获取滚动条宽度
#include <QScrollBar> //注意要添加头文件
if (ui.tableView->verticalScrollBar()->isVisible())
{
nVerBarWidth = ui.tableView->verticalScrollBar()->width();
}
- 滚动到底部
ui.tableView->scrollToBottom();
表头
- 隐藏表头
ui.tableView->verticalHeader()->hide();
- 设置表头标签
m_itemModel->setHorizontalHeaderLabels(QStringList() << "名称" << "参数1" << "参数2" << "参数3");
- 获取列表头宽度
ui.tableView->verticalHeader()->width();
- 设置表头的调节方式(可设置在表格视野内填充显示各列,无需设置各列的宽度)
ui.tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//表头自动填充空白
模式 | 描述 |
---|---|
QHeaderView::Interactive | 可交互调整 |
QHeaderView::Fixed | 固定不可调节 |
QHeaderView::Stretch | 自动填充空白,不可手动调节 |
QHeaderView::ResizeToContents | 根据内容调整,不可手动调节(如果列宽固定,则超出的内容会换行显示) |
信号
- 点击表格的某项
void on_tableView_clicked(QModelIndex index)
{
int row = index.row();
int col = index.column();
}
- 数据项被编辑
connect(m_itemModel,SIGNAL(itemChanged(QStandardItem *)),this,SLOT(sls_itemChanged(QStandardItem *)));
void sls_itemChanged(QStandardItem *item)
{
int row = item->row();
QString text=item->text();
}
- 鼠标进入数据项
public slots:
void on_tableWidget_entered(QModelIndex);
//注意:要实现鼠标滑过时进入,需开启鼠标跟踪
ui.tableWidget->setMouseTracking(true);
向单元格添加控件
QStandardItemModel *model=new QStandardItemModel(2,8,this);
QTableView *tableView=new QTableView(this);
tableView->setModel(model);
//重点
int row=0;
int column=0;
QWidget *widget=new QWidget(this)
tableView->setIndexWidget(model->index(row,column),widget);
row = 1;
col = 1;
//以下代码是向单元格中添加一张居中的图片
QLabel label;
QPixmap pixmap("eye.png");
pixmap = pixmap.scaled(15, 15, Qt::KeepAspectRatio, Qt::SmoothTransformation); // 按比例缩放
label.setPixmap(pixmap);
label.setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
ui->tableView->setIndexWidget(model->index(1, 1), &label);