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. Software development challenges around index creation for data models

Software development challenges around index creation for data models

Scheduled Pinned Locked Moved Unsolved General and Desktop
data modelssoftware designindex creationalgorithmsintegers
26 Posts 3 Posters 6.2k Views
  • 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.
  • K kshegunov
    12 Oct 2018, 05:28

    @elfring said in Software development challenges around index creation for data models:

    This design approach sounds very promising. How should data accesses be redirected to the existing container object here?

    MyModel::MyModel(QObject * parent)
        : QAbstractTableModel(parent), dataSource(nullptr)
    {
    }
    
    void MyModel::setDataSource(MyDataSource * source)
    {
        if (dataSource)  {
            QObject::disconnect(this, nullptr, dataSource, nullptr);
            QObject::disconnect(dataSource, nullptr, this, nullptr);
        }
    
        dataSource = source;
    
        QObject::connect(dataSource, &MyDataSource::dataChangeStarted, this, &MyModel::beginResetModel);
        QObject::connect(dataSource, &MyDataSource::dataChangeFinished, this, &MyModel::endResetModel);
    }
    
    QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
    {
        if (role != Qt::DisplayRole || orientation != Qt::Horizontal || section >= dataSource->columnCount())
            return QVariant();
    
        Q_ASSERT(dataSource);
        return dataSource->columnName(section);
    }
    
    int MyModel::rowCount(const QModelIndex &) const
    {
        Q_ASSERT(dataSource);
        return dataSource->rowCount();
    }
    
    int MyModel::columnCount(const QModelIndex &) const
    {
        Q_ASSERT(dataSource);
        return dataSource->columnCount();
    }
    
    QVariant MyModel::data(const QModelIndex & index, int role) const
    {
        Q_ASSERT(dataSource);
    
        if (!index.isValid() || role != Qt::DisplayRole)
            return QVariant();
    
        return dataSource->value(index.row(), index.column());
    }
    

    and of course the corresponding interface:

    
    class MyDataSource : public QObject
    {
        Q_OBJECT
        Q_DISABLE_COPY(MyDataSource)
    
    public:
        MyDataSource(QObject * = nullptr);
    
        virtual int rowCount() const = 0;
        virtual int columnCount() const = 0;
        virtual QString columnName(int) const = 0;
        virtual QVariant value(int, int) const = 0;
    
        virtual QString format(const QVariant &, int) const;
    
    signals:
        void changed();
    
        void dataChangeStarted();
        void dataChangeFinished();
    
    protected slots:
        virtual void reloadData() = 0;
    };
    
    E Offline
    E Offline
    elfring
    wrote on 12 Oct 2018, 06:32 last edited by
    #21

    and of course the corresponding interface:

    Will your data source provide homogenous items for this model?

    K 1 Reply Last reply 12 Oct 2018, 06:45
    0
    • E elfring
      12 Oct 2018, 06:32

      and of course the corresponding interface:

      Will your data source provide homogenous items for this model?

      K Offline
      K Offline
      kshegunov
      Moderators
      wrote on 12 Oct 2018, 06:45 last edited by kshegunov 10 Dec 2018, 06:45
      #22

      @elfring said in Software development challenges around index creation for data models:

      Will your data source provide homogenous items for this model?

      Do you mean the data types? If so, then no, the data types are different for the different columns of the table.

      Read and abide by the Qt Code of Conduct

      E 1 Reply Last reply 12 Oct 2018, 07:11
      0
      • K kshegunov
        12 Oct 2018, 06:45

        @elfring said in Software development challenges around index creation for data models:

        Will your data source provide homogenous items for this model?

        Do you mean the data types? If so, then no, the data types are different for the different columns of the table.

        E Offline
        E Offline
        elfring
        wrote on 12 Oct 2018, 07:11 last edited by
        #23

        …, the data types are different for the different columns of the table.

        Will your data source work without hierarchies then?

        K 1 Reply Last reply 12 Oct 2018, 09:11
        0
        • K kshegunov
          12 Oct 2018, 05:28

          @elfring said in Software development challenges around index creation for data models:

          This design approach sounds very promising. How should data accesses be redirected to the existing container object here?

          MyModel::MyModel(QObject * parent)
              : QAbstractTableModel(parent), dataSource(nullptr)
          {
          }
          
          void MyModel::setDataSource(MyDataSource * source)
          {
              if (dataSource)  {
                  QObject::disconnect(this, nullptr, dataSource, nullptr);
                  QObject::disconnect(dataSource, nullptr, this, nullptr);
              }
          
              dataSource = source;
          
              QObject::connect(dataSource, &MyDataSource::dataChangeStarted, this, &MyModel::beginResetModel);
              QObject::connect(dataSource, &MyDataSource::dataChangeFinished, this, &MyModel::endResetModel);
          }
          
          QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
          {
              if (role != Qt::DisplayRole || orientation != Qt::Horizontal || section >= dataSource->columnCount())
                  return QVariant();
          
              Q_ASSERT(dataSource);
              return dataSource->columnName(section);
          }
          
          int MyModel::rowCount(const QModelIndex &) const
          {
              Q_ASSERT(dataSource);
              return dataSource->rowCount();
          }
          
          int MyModel::columnCount(const QModelIndex &) const
          {
              Q_ASSERT(dataSource);
              return dataSource->columnCount();
          }
          
          QVariant MyModel::data(const QModelIndex & index, int role) const
          {
              Q_ASSERT(dataSource);
          
              if (!index.isValid() || role != Qt::DisplayRole)
                  return QVariant();
          
              return dataSource->value(index.row(), index.column());
          }
          

          and of course the corresponding interface:

          
          class MyDataSource : public QObject
          {
              Q_OBJECT
              Q_DISABLE_COPY(MyDataSource)
          
          public:
              MyDataSource(QObject * = nullptr);
          
              virtual int rowCount() const = 0;
              virtual int columnCount() const = 0;
              virtual QString columnName(int) const = 0;
              virtual QVariant value(int, int) const = 0;
          
              virtual QString format(const QVariant &, int) const;
          
          signals:
              void changed();
          
              void dataChangeStarted();
              void dataChangeFinished();
          
          protected slots:
              virtual void reloadData() = 0;
          };
          
          VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on 12 Oct 2018, 08:57 last edited by
          #24

          @kshegunov said in Software development challenges around index creation for data models:

          QObject::connect(dataSource, &MyDataSource::dataChangeStarted, this, &MyModel::beginResetModel);
          QObject::connect(dataSource, &MyDataSource::dataChangeFinished, this, &MyModel::endResetModel);

          I know you can do better than this mate! I know you have to create and connect a gazillion signals but at least you don't build everything from scratch

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          K 1 Reply Last reply 12 Oct 2018, 09:10
          0
          • VRoninV VRonin
            12 Oct 2018, 08:57

            @kshegunov said in Software development challenges around index creation for data models:

            QObject::connect(dataSource, &MyDataSource::dataChangeStarted, this, &MyModel::beginResetModel);
            QObject::connect(dataSource, &MyDataSource::dataChangeFinished, this, &MyModel::endResetModel);

            I know you can do better than this mate! I know you have to create and connect a gazillion signals but at least you don't build everything from scratch

            K Offline
            K Offline
            kshegunov
            Moderators
            wrote on 12 Oct 2018, 09:10 last edited by kshegunov 10 Dec 2018, 09:14
            #25

            @VRonin said in Software development challenges around index creation for data models:

            I know you can do better than this mate! I know you have to create and connect a gazillion signals but at least you don't build everything from scratch

            Actually I can't in this case. I know you want me to emit the row/columns changed and the ***Inserted/***Deleted signals, but it simply isn't applicable in this particular case.

            PS.
            Here the data comes from a long JOIN of tables and I'd rather emit modelReset after I had processed all the peculiarities, than to do a fetch from the database on each displayed cell/row.

            Read and abide by the Qt Code of Conduct

            1 Reply Last reply
            1
            • E elfring
              12 Oct 2018, 07:11

              …, the data types are different for the different columns of the table.

              Will your data source work without hierarchies then?

              K Offline
              K Offline
              kshegunov
              Moderators
              wrote on 12 Oct 2018, 09:11 last edited by
              #26

              @elfring said in Software development challenges around index creation for data models:

              Will your data source work without hierarchies then?

              I don't follow. This is a table model, there's no hierarchy here.

              Read and abide by the Qt Code of Conduct

              1 Reply Last reply
              0

              21/26

              12 Oct 2018, 06:32

              • Login

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