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
Forum Updated to NodeBB v4.3 + New Features

TableView model proxy problem

Scheduled Pinned Locked Moved General and Desktop
2 Posts 1 Posters 2.8k 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