[QTableView remove selected rows?



  • Hi guys, I have issue with QTableView... I can't remove selected items from the table correctly ... I got two methods:

    @
    for(int i=...)
    {
    view->model()->removeRow(i);
    @

    Which works fine if I pick up each line separately, or this one:
    @
    for(int i=...)
    {
    view->model()->removeRow(view->currentIndex().row());
    @
    which works good only if I use Drag'n'Drop technique...

    Both works only in specific situation of selecting lines, but I can't reach the correct answer how to remove selected lines (by picking up, or by Drag'n'Drop)....How to remove lines from QTableView??



  • Maybe you need a "QTableView::selectedIndexes()":http://qt-project.org/doc/qt-4.8/qtableview.html#selectedIndexes.



  • Yea, I am using that one.

    But I have solved that by decrementing (and removing from the end of the table view, not from the beginning):
    I shouldn't increment over the list and remove the first items because table was shifting rows after I have removed one - and that was making issues. So I had to write decrementing cycle and removing from the end of the table view - after shifting I am able to remove the correct row.

    From:
    @
    QList<int> rowIndexes;
    for (int i = 0; i < rowIndexes.count(); ++i)
    tableView->model()->removeRow(rowsIndexes[i]); // shifting rows after removing causes "bad removing"
    @

    To:
    @
    QList<int> rowIndexes;
    for (int i = rowIndexes.count(); i >= 0; --i)
    tableView->model()->removeRow(rowsIndexes[i]);
    @



  • @Peppy
    Hi All,
    We can do using this push button method for deleting row of table.
    void MainWindow::on_delete_record_clicked()
    {

     QSqlQuery* query=new QSqlQuery();
    
    
    QString str4;
    str4 = ui->lineEdit_5->text();
    

    // int id=str4.toInt();
    query->addBindValue(str4);
    /*
    QString str3;
    str3 = ui->lineEdit_4->text();
    query->addBindValue(str3);
    */
    query->prepare("DELETE FROM entry where id = 'id' ");
    // query->addBindValue(":id");
    //ui->tablewidget->removeRow(ui->tablewidget->currentRow());

    query->exec();
    if (query->exec())
    {
    
        QMessageBox::critical(this,tr("Delete"),tr("Deleted"));
        //db.close();
    
    }


  • Hi All,
    With the above code i could not able to remove the selected rows from the QTableview is interface with database conncetion......please any one guide me



  • I am not able to delete by selecting entire row from the Qtableview using delete push button ...give me some examples



  • // get the selected indexes
    QModelIndexList selectedIndexes = tableView->selectionModel()->selectedIndexes();
    // make sure you are not deleting from a tree
    Q_ASSERT(std::equal(selectedIndexes.constBegin()+1,selectedIndexes.constEnd(),selectedIndexes.constBegin(),[](const QModelIndex& a,const QModelIndex& b)->bool{return a.parent()==b.parent();}));
    // sort from bottom to top
    std::sort( selectedIndexes.begin(),selectedIndexes.end(),[](const QModelIndex& a,const QModelIndex& b)->bool{return b.row()<a.row();});
    QSet<int> deletedRows; // keep a record of rows already deleted
    for(auto i = selectedIndexes.constBegin();i!=selectedIndexes.constEnd();++i){
    if(deletedRows.contains(i->row())) 
    continue; //row deleted already, move on
    if(tableView->model()->removeRow(i->row(),i->parent())) // try to delete the row
    deletedRows << i->row(); // if successful store the row as deleted
    }
    


  • @VRonin

    I got selectedIndexes is 5 ITEMS while debugging my code "deletedRows" is 0 after that my selected row is remains same only it is not deleted .....my QTableview is connected with database.....



  • @veera said in [QTableView remove selected rows?:

    QTableview is connected with database

    What model are you using?



  • @VRonin
    I am using this model
    QSqlQueryModel *model = new QSqlQueryModel;



  • from http://doc.qt.io/qt-5/qsqlquerymodel.html:

    The QSqlQueryModel class provides a read-only data model for SQL result sets.

    Since it's read only it does not allow you to delete rows



  • Then which model i need to use and how to do it please give me some examples ........



  • either QSqlTableModel (be carefull with this one, read the docs) or you manually populate a QStandardItemModel from the data you get from a QSqlQuery



  • give me some examples so that i can understand it better





  • Its not happening ....... i have selected one and tried but its not deleting and tried many rows also not deleting my database is MSSQL in Ubuntu.....



  • 30 minutes before giving up?

    create a dummy table in your database (so even in case of a disaster you won't lose anything important) and try with QSqlTableModel



  • I want to something this type of query
    query->prepare("DELETE FROM Info WHERE ID = ?");
    query->addBindValue(ID);
    for deleting of entire row by selecting a particular row...........



  • QSqlTableModel or QSqlRelationalTableModel does that for you if you can live with simple queries. if you have convoluted joins then you'll have to connect to the model rowsRemoved or rowsAboutToBeRemoved signal and prepare the query manually



  • @VRonin
    I am a beginner of MS SQL so please give me examples



  • ... it's included as part of Qt's examples: http://doc.qt.io/qt-5/qtsql-relationaltablemodel-example.html



  • i go through the examples in that they creating QTableView *view = new QTableView; but i am designed in the UI drag and drop of Tableview and everything so.........



  • There is absolutely no difference. The trag and drop in Qt Designer generates an xml file describing your interface then uic converts that xml into code basically identical to the one in the examples.

    On top of this, your problem is not in the UI but in the model design so you should not really care about how the UI is created



  • I go through those examples ,explaining the inserting data into the tableview but they did not explain the deleting particular row after selecting it........



  • through out my project i am using this model
    QSqlQueryModel *model = new QSqlQueryModel;
    its happening by executing qurey by passing id via line edit but i am trying selecting entire row and pressing delete is not happening ......



  • QSqlQueryModel is read only. you cannot delete, insert or change anything



  • with this model only i am inserting and updating data into qtableview but delete is not happening ?,if u want i can share the code insert and updating data .......


Log in to reply