Software development challenges around index creation for data models
-
@elfring said in Software development challenges around index creation for data models:
How would you map a data model to Qt programming interfaces when each level within a hierarchy should correspond to a specific class?
Explain what you mean by that.
-
In this case I'd use a generic item that supports
QVariant
and store the class in it as data.
An alternative is to have an item with avoid*
(or a common base class if available) containing the class instance and anint
that keeps track of what type that pointer is holding so it can bedynamic_casted
when needed -
Explain what you mean by that.
Will the following hierarchy example help for a better common understanding of a possible data model?
- Directories contain files.
- Text files can contain several lines.
- Text lines contain characters.
Which classes would you like to use then in your software application?
-
The model infra is abstract enough so you can attach whatever you want to it. What you're describing is (kind of) a file system model with additional tweaks so you can subclass it and implement the last part. Or you can start from scratch and implement your own if you like.
For my current project I use the model simply as a proxy to an abstract class that holds the data (due to various reasons), so you can do that either if you like. The options are limitless ...
-
I'd use the QVariant approach
I am occasionaly trying to avoid the data transfer by such a generic class.
Will it make sense to apply an other software design composition?
- Can it make sense to map even simple hierarchy levels to separate model classes?
- Should relationships between model instances be expressed separately?
-
What you're describing is (kind of) a file system model
Did anybody try to represent data as a file system for model variants besides the usage of the class “QFileSystemModel”?
with additional tweaks so you can subclass it and implement the last part.
I am trying again to clarify corresponding software development possibilities.
For my current project I use the model simply as a proxy to an abstract class that holds the data …
This design approach sounds very promising. How should data accesses be redirected to the existing container object here?
-
@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; };
-
@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.
-
@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
-
@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 longJOIN
of tables and I'd rather emitmodelReset
after I had processed all the peculiarities, than to do a fetch from the database on each displayed cell/row. -
@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.