Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. TableView model proxy problem
Qt 6.11 is out! See what's new in the release blog

TableView model proxy problem

Scheduled Pinned Locked Moved General and Desktop
2 Posts 1 Posters 3.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    poporacer
    wrote on last edited by
    #1

    I have a program that uses several tables and I highlight certain cells in the tableView. I have a proxyModel to make this happen. I use almost identical code for several different tables but on one tableView it isn't showing correctly. The first thing I notice is that the table is shown in reverse order. In other words, the table shows the last item from the database first. All the other tableViews I use, show the data in a first to last order. The other problem is that the correct data is not highlighted. If the table was in the correct order, the correct cell would be highlighted. I think my problem might be with a mapToSource issue but I don't know what index to use?? (I am a Newbie to Qt and trying to learn) I do not know why the table is shown in reverse order? Also, what events trigger the setData() function?

    Here is the code I have for the proxy model:

    myproxymodel.h
    @#ifndef MYPROXYMODEL_H
    #define MYPROXYMODEL_H

    #include <QSortFilterProxyModel>

    class MyProxyModel : public QSortFilterProxyModel
    {
    Q_OBJECT

    public:
    MyProxyModel(QObject* parent);
    ~MyProxyModel();
    QVariant data ( const QModelIndex & index, int role )const;

    private:
    int m_lowScore;
    int m_highScore;
    int m_lowReactRow;
    int m_fastReactRow;

    MyProxyModel* proxy;

    private slots:
    void getRows (int, int, int, int);

    };

    #endif //MYPROXYMODEL_H@

    myproxymodel.cpp
    @#include "myproxymodel.h"

    MyProxyModel::MyProxyModel (QObject *parent) :
    QSortFilterProxyModel(parent)
    {

    }
    MyProxyModel::~MyProxyModel()
    {

    }

    QVariant MyProxyModel::data ( const QModelIndex & index, int role ) const
    {
    QModelIndex sourceIndex = mapToSource(index);

    if (!sourceIndex.isValid())
    return QVariant();
    if (m_slowReactRow<0)
    {
    if ( sourceIndex.row() == m_highScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
    {
    return QVariant( Qt::yellow );
    }
    else if ( sourceIndex.row() == m_lowScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
    {
    return QVariant( Qt::red );
    }

    else
    {
    return QSortFilterProxyModel::data( index, role );
    } 
    

    }
    else
    {
    if ( sourceIndex.row() == m_highScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
    {
    return QVariant( Qt::yellow );
    }
    else if ( sourceIndex.row() == m_lowScore && sourceIndex.column()== 2 && role == Qt::BackgroundRole )
    {
    return QVariant( Qt::red );
    }
    else if (sourceIndex.row()== m_fastReactRow && sourceIndex.column()==3 && role == Qt::BackgroundRole)
    {
    return QVariant( Qt::yellow );
    }
    else if ( sourceIndex.row() == m_slowReactRow && sourceIndex.column()== 3 && role == Qt::BackgroundRole )
    {
    return QVariant( Qt::red );
    }
    else
    {
    return QSortFilterProxyModel::data( index, role );
    }
    }
    }
    void MyProxyModel::getRows( int rowLow,int rowHigh, int rowSlowReact, int rowFastReact)
    {
    m_highScore=rowHigh;
    m_lowScore=rowLow;
    m_slowReactRow= rowSlowReact;
    m_fastReactRow= rowFastReact;
    }@

    This is the table creation code for one of the tableViews that show correctly:
    testclass.cpp
    @void TestClass::createTimerTable() // this is called in the constructor of the form
    {
    testModel= new QSqlRelationalTableModel(this);
    testModel->setEditStrategy(QSqlTableModel::OnRowChange);
    testModel->setTable("testtable");
    testModel->setRelation(2,QSqlRelation("student","id", "LName"));
    testModel->setRelation(3,QSqlRelation("testNum", "id","Test"));
    testModel->setHeaderData(1,Qt::Horizontal,"Section");
    testModel->select();

    proxy = new MyProxyModel (this);
    proxy->setSourceModel(testModel);
    ui->tableView->setModel(proxy);
    
    connect(this,SIGNAL(sendRows(int, int, int, int)),
       proxy, SLOT(getRows(int, int, int, int)));
    
    //set up tableview
    ui->tableView->setItemDelegate(new QSqlRelationalDelegate(this));
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView->setColumnHidden(0,true); // id
    ui->tableView->resizeColumnsToContents();
    ui->tableView->horizontalHeader()->setStretchLastSection(true);
    

    }
    void TestClass::setTable(QString desc) //This is called in the constructor after createTimerTable
    {
    mTableString=desc;
    testModel->setFilter(QString(desc));
    testModel->select();
    updateTimeStats();
    }
    void TestClass::updateTimeStats()
    {
    float totScore=0;
    float totReactTime=0;
    float lowScore=FLT_MAX;
    int rowLowScore=0;
    int rowHighScore =0;
    int rowSlowReact =0;
    int rowFastReact =0;
    float slowReactTime =FLT_MIN;
    float highScore=FLT_MIN;
    float fastReactTime=FLT_MAX;
    float currentScore=0;
    float currentReactTime =0;
    QString string;
    int totRows=proxy->rowCount();
    if (totRows >0)
    {
    for (int r=0; r<totRows; r++)
    {
    currentScore=proxy->index(r,2).data(Qt::DisplayRole).toFloat();
    currentReactTime=proxy->index(r,3).data(Qt::DisplayRole).toFloat();

        if (currentScore < lowScore)
            {
             lowScore=currentScore;
             rowLowScore=r;
             }
    
        if (currentScore > highScore)
            {            
             highScore=currentScore;
             rowHighScore =r;
             }
    
        if (currentReactTime > slowReactTime)
            {
            slowReactTime=currentReactTime;
            rowSlowReact =r;
            }
    
        if (currentReactTime<fastReactTime)
            {
            fastReactTime=currentReactTime;
            rowFastReact =r;
            }
        
        totTime+=currentTime;
        totReactTime+=currentReactTime;
    
     }
     startModel->select();
    

    }
    @
    //continued next post

    1 Reply Last reply
    0
    • P Offline
      P Offline
      poporacer
      wrote on last edited by
      #2

      Here is the code for the tableView that is in reverse order and not highlighted correctly:
      dlgprint.cpp
      @void DlgPrint::createReportTable(QStringList stringList) //strinLlist is used elsewhere
      {

      printModel= new QSqlRelationalTableModel (this);
      printModel-> setEditStrategy(QSqlTableModel::OnManualSubmit);
      printModel-> setTable (mTableName); //string identified through assessor function
      printModel-> setRelation (2, QSqlRelation("student", "id", "LName"));
      printModel-> setRelation (3, QSqlRelation("testNum", "id", "Test"));
      printModel->setFilter(mFilterString);
      printModel->select();
      
      proxy = new MyProxyModel(this);
      proxy->setSourceModel(printModel);
      ui->printView->setModel(proxy);
      
      connect(this,SIGNAL(sendRows(int, int, int, int)),
          proxy, SLOT(getRows(int, int, int, int)));
      
      ui->printView->setItemDelegate(new QSqlRelationalDelegate(this));
      ui->printView->setSelectionMode(QAbstractItemView::SingleSelection);
      ui->printView->setSelectionBehavior(QAbstractItemView::SelectRows);
      ui->printView->setColumnHidden(0,true);//id
      ui->printView->resizeColumnsToContents();
      printModel->setHeaderData (2, Qt::Horizontal, "Score");
      ui->printView->setSortingEnabled(true);
      ui->printView->resizeColumnsToContents () ;
      ui->printView->horizontalHeader()->setStretchLastSection(true);
      highlightCells();
      printModel->select();
      

      }
      void DlgPrint::highlightCells()
      {
      float highScore= FLT_MIN;
      float lowScore= FLT_MAX;
      float fastReactionTime=FLT_MAX;
      float slowReactionTime=FLT_MIN;
      int rowHigh=0;
      int rowLow=0;
      int rowFastReact=0;
      int rowSlowReact=0;
      float totalTime =0;
      float totalReactTime=0;
      float averageScore =0;
      float averageReact=0;
      int totalRows = 0;
      float currentScore;
      float currentReactTime;
      QString string;

      int numRows =proxy->rowCount();

      for (int r=0; r<numRows; r++ )
      {

      currentscore = proxy->index(r,2).data(Qt::DisplayRole).toFloat();
      currentReactTime = proxy->index(r,3).data(Qt::DisplayRole).toFloat();

      //something here to mapToSource??

      if (currentScore > highScore)
      {
      highScore = currentScore;
      rowHigh = r;
      }
      if (currentScore < lowScore)
      {
      lowScore = currentScore;
      rowLow = r;
      }
      totalRows++;
      totalScore += currentScore;

      if (currentReactTime < fastReactionTime)
          {
          fastReactionTime = currentReactTime;
          rowFastReact = r;
          }
      if (currentReactTime > slowReactionTime)
          {
          slowReactionTime = currentReactTime;
          rowSlowReact = r;
          }
      totalReactTime += currentReactTime;
      }
      

      }

      if (totalRows !=0)
      {
      averageScore=totalScore/totalRows;
      averageReact=totalReactTime/totalRows;
      }

      emit sendRows (rowSlow, rowFast,rowSlowReact, rowFastReact);
      }@
      I tried to eliminate the code that was irrelevant to the table creation. Hopefully I didn't forget something. What is wrong here?

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved