I have a tableview controlled by a proxy. In the tableview, the highest and lowest values are highlighted through the data function in the proxy. I want the user to be able to delete a selected row (just from the view, not the source!) I have one method almost figured out. The problem is that when a row is deleted, the correct data is not highlighted. I think I need to use mapToSource and mapFromSource, but I haven't been able to get it to work properly.
This is the method I use...when the user deletes a row, the row is hidden in the tableView, then when the tableview is iterated to find the highest and lowest numbers, the hidden row is skipped. Then the identified rows are sent to the proxy to highlight the correct cells.

Is this the correct way or is there a better way? How do I get this to work?

Here is the code for the tableView creation:
testclass.cpp
Qt Code:
  1. void TestClass::createTimerTable() // this is called in the constructor of the form
  2. {
  3. testModel= new QSqlRelationalTableModel(this);
  4. testModel->setEditStrategy(QSqlTableModel::OnRowChange);
  5. testModel->setTable("testtable");
  6. testModel->setRelation(2,QSqlRelation("student","id", "LName"));
  7. testModel->setRelation(3,QSqlRelation("testNum", "id","Test"));
  8. testModel->setHeaderData(1,Qt::Horizontal,"Section");
  9.  
  10. proxy = new MyProxyModel (this);
  11. proxy->setSourceModel(testModel);
  12. ui->tableView->setModel(proxy);
  13.  
  14. connect(this,SIGNAL(sendRows(int, int, int, int)),
  15. proxy, SLOT(getRows(int, int, int, int)));
  16.  
  17. //set up tableview
  18. ui->tableView->setItemDelegate(new QSqlRelationalDelegate(this));
  19. ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
  20. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  21. ui->tableView->setColumnHidden(0,true); // id
  22. ui->tableView->resizeColumnsToContents();
  23. ui->tableView->horizontalHeader()->setStretchLastSection(true);
  24. }
  25.  
  26. void TestClass::updateTimeStats()
  27. {
  28. float totScore=0;
  29. float totReactTime=0;
  30. float lowScore=FLT_MAX;
  31. int rowLowScore=0;
  32. int rowHighScore =0;
  33. int rowSlowReact =0;
  34. int rowFastReact =0;
  35. float slowReactTime =FLT_MIN;
  36. float highScore=FLT_MIN;
  37. float fastReactTime=FLT_MAX;
  38. float currentScore=0;
  39. float currentReactTime =0;
  40. QString string;
  41. int totRows=proxy->rowCount();
  42. if (totRows >0)
  43. {
  44. for (int r=0; r<totRows; r++)
  45. {
  46. if (ui->printView->isRowHidden(r)) //Test if user deleted row
  47. continue;
  48. //QModelIndex sourceIndex=mapToSource(proxy->index(r,2));
  49. //QModelIndex sourceIndex2=mapToSource(proxy->index(r,3));
  50. //the above 2 lines gives a "mapToSource not declared" error
  51. // #include <QModelIndex> is declared
  52. currentScore=proxy->index(r,2).data(Qt::DisplayRole).toFloat();
  53. currentReactTime=proxy->index(r,3).data(Qt::DisplayRole).toFloat();
  54.  
  55. if (currentScore < lowScore)
  56. {
  57. lowScore=currentScore;
  58. rowLowScore=r;
  59. }
  60.  
  61. if (currentScore > highScore)
  62. {
  63. highScore=currentScore;
  64. rowHighScore =r;
  65. }
  66.  
  67. if (currentReactTime > slowReactTime)
  68. {
  69. slowReactTime=currentReactTime;
  70. rowSlowReact =r;
  71. }
  72.  
  73. if (currentReactTime<fastReactTime)
  74. {
  75. fastReactTime=currentReactTime;
  76. rowFastReact =r;
  77. }
  78.  
  79. totTime+=currentTime;
  80. totReactTime+=currentReactTime;
  81.  
  82. }
  83. startModel->select();
  84. }
To copy to clipboard, switch view to plain text mode 
myproxymodel.cpp
Qt Code:
  1. #include "myproxymodel.h"
  2.  
  3. MyProxyModel::MyProxyModel (QObject *parent) :
  4. {
  5.  
  6. }
  7. MyProxyModel::~MyProxyModel()
  8. {
  9.  
  10. }
  11.  
  12. QVariant MyProxyModel::data ( const QModelIndex & index, int role ) const
  13. {
  14. QModelIndex sourceIndex = mapToSource(index);
  15.  
  16. if (!sourceIndex.isValid())
  17. return QVariant();
  18. if (m_slowReactRow<0)
  19. {
  20. if ( sourceIndex.row() == m_highScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
  21. {
  22. return QVariant( Qt::yellow );
  23. }
  24. else if ( sourceIndex.row() == m_lowScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
  25. {
  26. return QVariant( Qt::red );
  27. }
  28.  
  29. else
  30. {
  31. return QSortFilterProxyModel::data( index, role );
  32. }
  33.  
  34. }
  35. else
  36. {
  37. if ( sourceIndex.row() == m_highScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
  38. {
  39. return QVariant( Qt::yellow );
  40. }
  41. else if ( sourceIndex.row() == m_lowScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
  42. {
  43. return QVariant( Qt::red );
  44. }
  45. else if (sourceIndex.row()== m_fastReactRow && sourceIndex.column()==3 && role == Qt::BackgroundRole)
  46. {
  47. return QVariant( Qt::yellow );
  48. }
  49. else if ( sourceIndex.row() == m_slowReactRow && sourceIndex.column()== 3 && role == Qt::BackgroundRole )
  50. {
  51. return QVariant( Qt::red );
  52. }
  53. else
  54. {
  55. return QSortFilterProxyModel::data( index, role );
  56. }
  57. }
  58. }
  59. void MyProxyModel::getRows( int rowLow,int rowHigh, int rowSlowReact, int rowFastReact)
  60. {
  61. m_highScore=rowHigh;
  62. m_lowScore=rowLow;
  63. m_slowReactRow= rowSlowReact;
  64. m_fastReactRow= rowFastReact;
  65. }
To copy to clipboard, switch view to plain text mode