众所周知,查询功能是所有基础操作中最麻烦的功能。
因为查询过程中如果要执行其他操作,可能会造成数据错位等情况。比如我原有五个数据,按搜索要求,检索出三个数据,我要删除搜索出的数据中第三个数据,此时删除的索引值是2,如果直接使用删除语句,则删除的是原数据中第三个数据,修改也是同理。
但是在QSqlTableModel中只需要使用Filter语句过滤,即可同步当前数据。
具体请看以下步骤:
- 首先实现搜索操作
LineEdit选用on_lineEdit_textChanged(const QString &arg1)槽函数,自定。
void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
QSqlTableModel * model = new QSqlTableModel(this,db);//新建model
model->setTable("EXAMPLE");//设置表
if(!arg1.isEmpty())//搜索栏为空
model->setFilter("city ='"+arg1+"'");//model过滤表中符合的数据
ui->tableView->setModel(model);
model->select();//显示修改后的数据
}
搜索前是这样的
搜索后是这样的
由此可见,只是简单的添加
model->setFilter("city ='"+arg1+"'")
就可以实现数据的筛选。
相当于数据库语句
select * from EXAMPLE where city='南京'
值得注意的是,这里的搜索内容在代码中就指定为city,如果想实现多功能的搜索,可以自行研究添加,只要在filter语句中将city替换即可。
- 开篇提到了数据错位的情况
那么我们在调用插入、修改、删除操作时,也要同时将model检索当前行编辑的值。
因为我这里的插入是从最后一行插入的,所以也需要修改;如果在插入时按照第0行插入,如语句model->insertRow(0);则不需要修改原代码。
在model->setTable(“EXAMPLE”);语句的下一行加上
if(!ui->lineEdit->text().isEmpty())//搜索栏为空
model->setFilter("city ='"+ui->lineEdit->text()+"'");//model过滤表中符合的数据
即可。
具体代码:
void MainWindow::on_pushButton_clicked()//添加按钮
{
AddRecord * add = new AddRecord(this);
add->exec();
if(!add->isClicked)
return;
QString *str = add->str;
QSqlTableModel * model = new QSqlTableModel(this,db);
model->setTable("EXAMPLE");
if(!ui->lineEdit->text().isEmpty())//搜索栏为空
model->setFilter("city ='"+ui->lineEdit->text()+"'");//model过滤表中符合的数据
int row = model->rowCount();
model->insertRow(row);
model->setData(model->index(row,1),str[0]);
model->setData(model->index(row,2),str[1].toInt());
model->setData(model->index(row,3),str[2]);
model->submitAll();//提交插入的数据
ui->tableView->setModel(model);//设置model模型
model->select();//显示
}
void MainWindow::on_pushButton_2_clicked()//删除按钮
{
int row = ui->tableView->currentIndex().row();//记录当前选择行
if(QMessageBox::Yes == QMessageBox::question(this,"Make Sure","确定删除第"+QString::number(row+1)+"行吗?",QMessageBox::Yes | QMessageBox::No , QMessageBox::Yes))
{//提示框,防止误操作,是/否,按下是的操作后
QSqlTableModel * model = new QSqlTableModel(this,db);//新建model
model->setTable("EXAMPLE");//设置表
if(!ui->lineEdit->text().isEmpty())//搜索栏为空
model->setFilter("city ='"+ui->lineEdit->text()+"'");//model过滤表中符合的数据
if(model->select())//判断是否为空表
model->removeRow(row);//删除当前行
model->submitAll();//提交修改的数据
ui->tableView->setModel(model);//设置模型
model->select();//显示修改后的数据
}
}
void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)//双击tableview
{
QSqlTableModel * model = new QSqlTableModel(this,db);//新建model
model->setTable("EXAMPLE");//设置表
if(!ui->lineEdit->text().isEmpty())//搜索栏为空
model->setFilter("city ='"+ui->lineEdit->text()+"'");//model过滤表中符合的数据
bool isOK;//定义bool类型
QString text = QInputDialog::getText(this,"Update","修改当前内容",QLineEdit::Normal,index.data().toString(),&isOK);//弹出修改框,默认显示当前内容,修改后点击按钮,是则isOK为true,否则isOK为false
if(!isOK)//判断isOKbool类型
return ;
if(model->select())//判断是否空表
model->setData(model->index(index.row(),index.column()),text);//重新设置当前单元格内容
model->submitAll();//提交修改
ui->tableView->setModel(model);
model->select();//显示修改后的数据
~~~