[Qt-interest] custom model question, cells depending on other cell

Andre Somers andre at familiesomers.nl
Fri Dec 18 17:43:26 CET 2009


franki wrote:
> Friday 18 of December 2009 08:18:02 André Somers napisał(a):
>   
>> Hi,
>>     
>
> Hi,
>
> Thank you for answer,
> My data comes from sql, I've used QSqlQueryModel, to be honest, earlier I 
> always did such an application in php, so maybe I'm looking for similar 
> solution, because example with background color of the table is just small 
> one. I've used to fetch all data from sql query, and then (if necessary) made 
> calculation by iterating throught all data, and changing what should be 
> change, and then passing entire array to template engine to display it. 
> That's very flexible, and allow me to change everything I need in the data 
> fetched from sql, and that's what i'm looking for.
> The second solution You wrote, would probably solve my background color 
> problem, but 5 minuts later I would have another one (like adding additional 
> column probably or something else), and I feel that best solution would be to 
> modify (somehow) data received from sql.
>   
If that is what you are looking for, than I suggest that that is what 
you do!
As long as the amount of data is reasonable and you need it fetch it all 
anyway, I don't see a real problem in downloading all the data into 
memory, do stuff with it, and then display it. I do that too when 
needed. So: go ahead, create a handy data structure to store all the 
data you need, do any calculation & modification you need, and create 
your own QAbstractItemModel derived* model based on that data structure 
that handles stuff like coloring.
In this scenario, I'd ditch your use of QSqlQueryModel though, and use 
QSqlQuery directly to get the data you need.

Another possible solution for the calculations and modifications: can't 
you do them efficiently in SQL itself? It really depends on what you 
want to do of course, but sometimes good old SQL is not that bad...

* Replace QAbstractItemModel by one of the (abstract) models based on it 
if they are more convenient.

> I haven't read very much about proxy models, will they allow me to iterate 
> throught data and calculate data and change values in role?
>   
Proxies are used mainly for filtering, but they can be used for other 
things like modifying data. Note that a proxy model is also a 
QAbstractItemModel subclass... That is: nothing prevents you to 
re-implement the data() method and return whatever you like there. You 
can even change the data structure (flatten trees for instance) if you 
want, but that kind of thing is non-trivial to say the least.
So sure, if you want to change values in a proxy model, you can. But, 
I'd be cautious with this. Changing the colour role for a row based on 
the value of one of it's columns and then hiding that column is one 
thing, but iterating over the whole dataset to calculate some value is 
quite another IMHO. Still, if you would be able to cache critical data 
for such calculations, it may be a viable solution.

For instance, say you have a table with numbers of items in each row, 
and you'd like to add a column that displays the proportion of the total 
numbers of items in the set. You'd only have to calculate the total once 
(assuming the data behind it not too volitile), so this could be done 
quite easily in a proxy model. You could have the proxy model get the 
data by iterating, or you could supply the proxy with the sum yourself 
based on a perhaps more efficient SQL query with a SUM () statement in 
it. However, I'd only use a proxy model solution if I'd be reasonably 
sure I can use the created solution again on a different source model, 
either in the same or in a different application. That is: it has to be 
reasonably generic. Otherwise it's not worth the trouble, IMHO.
> Second solution seems to be easy, column order is always the same, besides I 
> can search for data using QSqlRecord::indexOf but then data in model remains 
> unchanged, and customModel::data() will have to calculate roles and data each 
> time view request the data.
>
> So if I want to change values that comes from sql, inside model, and then when 
> I connect a view, it gets always previously calculated data from model, 
> should I opt for solution 3 - proxy model?
>   
I'm sorry, I don't get what you're trying to say here. Is the data in 
your database volitile? That is: does it change (frequently) while your 
application is running, by other means than your application itself?
> And is it ever possible (in read-only model) to change values fetched from 
> sql, values like DisplayRole, and others, and then let the view to operate on 
> modified data without implementing proxy model, or maybe those data in model 
> are read-only?
>   
The read-onlyness has only to do with if changes in the data can be 
written back, not if the data you pass along for the view can be 
modified in the process. Do you plan to write back data to your database 
from your model?

André



More information about the Qt-interest-old mailing list