QTabelView的与数据库相关增、删、查、改总结

首先,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);

 

你可能感兴趣的:(qt,QTableView,QT编程)