Quantcast
Channel: Jobs
Viewing all articles
Browse latest Browse all 18427

Sorting with QStandardItemModel and QTableView

$
0
0
Hello, I’m trying to make a simple sorting on a QTableView, where the model is a QStandardItemModel, and the sorting is a QSortFilterProxyModel, but a very strange thing is going on. What I need is automatic sorting, which is, every time a object is modified on the model, it should sort acordingly to the column number 7. It works, partially, if I use the table->sortByColumn(7,Qt::Descending), it works normally, however for Qt::Acending, it starts changing the data on the last row, and only that! And the more strange part is, if I use manuall sorting and click on the header, it works flawlessly. Here are some snippets of the code I’m using: This is the constructor:     ui->setupUi(this);     this->connectSlots();       //Create the model     this->model = new QStandardItemModel(ui->athleteView);     this->refreshModel();       this->proxyModel = new QSortFilterProxyModel(this);     this->proxyModel->setSourceModel(model);     ui->athleteView->setModel(this->proxyModel);     ui->athleteView->setSortingEnabled(true);     ui->athleteView->sortByColumn(7); And this the method that is called every time there’s a change on the model: void InlineSpeedTimer::refreshModel(){     this->model->clear();     int row, col;     row=0;     //Set headers     col=0;     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Name"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Surname"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Team"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Age"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Time 1"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Time 2"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Time 3"));     this->model->setHorizontalHeaderItem(col++,new QStandardItem("Final time"));     //Set information     for(athlItr=this->athletes.begin(); athlItr!=this->athletes.end(); ++athlItr){         col=0;         this->model->setItem(row,col++, new QStandardItem((*athlItr)->getName()) );         this->model->setItem(row,col++, new QStandardItem((*athlItr)->getSurname()) );         this->model->setItem(row,col++, new QStandardItem((*athlItr)->getTeam()) );         this->model->setItem(row,col++, new QStandardItem( QString::number((*athlItr)->getAge())) );         this->model->setItem(row,col++, new QStandardItem( this->createTimeFromMsecs( (*athlItr)->getTime(0)) ));         this->model->setItem(row,col++, new QStandardItem( this->createTimeFromMsecs( (*athlItr)->getTime(1)) ));         this->model->setItem(row,col++, new QStandardItem( this->createTimeFromMsecs( (*athlItr)->getTime(2)) ));         this->model->setItem(row,col++, new QStandardItem( this->createTimeFromMsecs(                                                                ( (*athlItr)->getTime(0)+(*athlItr)->getTime(1)+(*athlItr)->getTime(2) )/3)));         for(col=0;col<8;col++)             this->model->item(row,col)->setEditable(false);           row++;     }     if(this->athletes.size()>0){         this->ui->editButton->setEnabled(true);         this->ui->deleteButton->setEnabled(true);     }     else{         this->ui->editButton->setEnabled(false);         this->ui->deleteButton->setEnabled(false);         this->ui->startButton->setEnabled(false);     }     this->ui->athleteView->resizeColumnToContents(4);     this->ui->athleteView->resizeColumnToContents(5);     this->ui->athleteView->resizeColumnToContents(6);     this->ui->athleteView->resizeColumnToContents(7);     this->ui->athleteView->sortByColumn(7/*,Qt::AscendingOrder*/); } If you see the call this->ui->athleteView->sortByColumn(7/*,Qt::AscendingOrder*/);, if I remove the comments regarding the Qt::AscendingOrder, it cracks everything on the table view as I’ve told before. Thanks for the help.

Viewing all articles
Browse latest Browse all 18427

Trending Articles