首先,QTableView能提供一种连接数据库表的模式,直接进行存取,代码如下:
QSqlDatabasedb;//数据库连接
QSqlTableModel *sqlTable;//TabelView数据表模式
······································
sqlTable= newQSqlTableModel(this,db);//建立数据表模式QTabelView用
··························
sqlTable->setTable("area");//加载数据表
sqlTable->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置编辑策略为手动提交模式
//sqlTable->removeColumn(0);//删掉第一列,一般为数据库ID列
sqlTable->select();//选择所有符合条件的数据显示出来
ui->areaTableView->setModel(NULL);//清空
ui->areaTableView->setModel(sqlTable);//设置数据模型为sqlTable
ui->areaTableView->verticalHeader()->hide();//默认显示行头,如果你觉得不美观的话,我们可以将隐藏
//设置选中时为整行选中
ui->areaTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
//设置表格的单元为只读属性,即不能编辑
ui->areaTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//使用QTableView自适应内容
ui->areaTableView->resizeColumnsToContents();
//如果你用在QTableView中使用右键菜单,需启用该属性
ui->areaTableView->setContextMenuPolicy(Qt::CustomContextMenu);
//设置为只能选择一行
ui->areaTableView->setSelectionMode(QAbstractItemView::SingleSelection);
一、增加记录(只是表面上增加了一行)
楼主设置了提交模式为 sqlTable->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置编辑策略为手动提交模式 因此最后必须手动提交
void MainWindow::on_m_AddBtn_clicked()
{
int rowNum = sqlTable->rowCount();//得到数据表的行数
sqlTable->insertRow(rowNum);//在最后一行插入新的行
}
二、删除
如何获得鼠标选择的某一行甚至某几行很关键。
楼主采用设置QTableView只能选择一行的策略 ui->areaTableView->setSelectionMode(QAbstractItemView::SingleSelection);//设置为只能选择一行
这样获取鼠标点击的行就很容易了,
int selectedRow = ui->areaTableView->currentIndex().row();//获得当前选择的行号
sqlTable->removeRow(selectedRow);//在数据表中删除
ui->areaTableView->setRowHidden(selectedRow,true);//将该行隐藏
如果要是允许选择多行的话,应该需要自己判断,可参考如下
QModelIndexListselected = ui->areaTableView->selectionModel()->selectedIndexes();
for(int i = 0;i < selected.count();i++)
{ QModelIndex index = selected.at(i);
qDebug()<<i<<","<<index.row();
}
上面代码中,index索引是按单元格来进行记录的,因此要获得行号,就必须自己写算法提取出相关行号
下面是一种方法:
void ALocalvalueTableView::removeSelected() { QMap<int, int> rows; foreach (QModelIndex index, selectedIndexes()) rows.insert(index.row(), 0); QMapIterator<int, int> r(rows); r.toBack(); while (r.hasPrevious()) { r.previous();model()->removeRow(r.key()); } // while } // removeSelected
还可以参考另一种算法:
bool bArr[65536]={false}; int cnt=0,srcArr[N],desArr[N];//令srcArr[N]为源数据 for (int i = 0; i < N; ++i) { if( bArr[srcArr[i]])//存在 { continue; } else//不存在 { bArr[srcArr[i]]=true; desArr[cnt]=srcArr[i]; cnt++; } }
三、修改
修改和删除一样必须首先获得选择的行号,参看上面,
修改的话,edit函数只能按单元格修改,代码如下:
QModelIndexselectedIndex= ui->areaTableView->currentIndex();
ui->areaTableView->edit(selectedIndex);