Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Qt Model/View with non-table like data and non-table/list UI?

I've been reading about Qt's Model/View framework. I find it really helpful on working with tabled data like tables from a database. My question is: will it be useful for non-table data like property list or just some bunch of data of various types? If so, how should I approach it?

The goal is to come up with an editor for some property list like data. The list is constructed at runtime and the elements are of various types (numbers, strings, booleans, and file paths, to name a few). Each element is basically a name-value pair. The name, type, and restrains (limits for example) for each element are defined at compile time. They will be assembled at runtime into different lists depending on user input. And the list of elements can change during the edit session.

The UI will most likely be combination of various pre-designed widgets assembled according to user input. They may not be list or table views.

Some pointer to design pattern or examples are also much appreciated. Thanks.

like image 391
Stephen Chu Avatar asked Mar 13 '12 15:03

Stephen Chu


2 Answers

I don't see a problem with MVC framework in QT for doing that.

Basically the difference between a standard table display and this is that you create a list dynamically akin to a map of:

QMap<QString, QVariant> property_map;

You can do a:

QList<std::pair<QString, QVariant>> property_list;

which you can then use to display in a table the property. The best way would probably be:

struct {
   QString prop_name;
   int prop_type;
   QVariant prop_value;
};

QVariant basically will provide you with a single abstraction class for data storage and it is actually what's being returned by the data() function inside the QAbstractItemModel which you might be reimplementing.

So basically you will take a property list and boil it down to the same table like data as the database.

AMENDED

If you have a Widget that you want to have this widget populated with other predefined widgets you are quite likely to have multiple problems unless widgets are of same or well defined size.

What you can do is in you Display widget define a layout like: QGridLayout or other possible layouts and then add your other widgets to it using some set of parameters, which could be done but can be somewhat of a pain.

The other approach that you may take is to place all property widgets up front on the display UI and simply turn the ones you need on and the rest off, but this only applicable if you have a well defined limited number of pre-designed widgets.

like image 56
Karlson Avatar answered Oct 12 '22 22:10

Karlson


I've been using Model/View framework for quite some time now and I usually implement my own models with a backend based on Qt containers (vectors, list, etc). Even if data eventually comes from a database, working with (e.g.) a vector of database ids can dramatically improve performance (and sometimes is the only way you can do).

This trivial example from Qt docs (see "Creating a Custom Model) is the point where I started and shows how to use a QStringList as a backend for a custom model.

Once defined your model you can define your custom Views, which will draw arranged widgets based on the content of the model underneath. When the model change, your view will change accordingly rearranging widgets when necessary. Leveraging QVariant capabilities you should be able to render the proper widget for every datatype (e.g. a QSpinBox for a float a QComboBox for a QStringList, and so on...)

like image 27
Masci Avatar answered Oct 12 '22 22:10

Masci