Proper way to create Desktop Apps with modern Qt?
-
Hello,
I want to create a simple App, basically it stores people (Name, Birthday, Wishes, etc.) and allows you to view/add/edit/delete, also it would remind you of upcoming birthdays but that is trivial once you have the right architecture.
It could just as well be a shopping list app or a basic notes app, it doesn't matter. You have some data and want a view/add/edit/delete interface for it.
Right now I have a class Person, which represents the type of data I want to store. I store the people in a QMap<QString, Person> (member variable of MainWindow, ugh) where the key is the name of the person. I have several locations inside my app where I would like to have a List Widget/View displaying all names by which I can select/filter the various records. Picture a list on the left where I can select various names and on the right the respective data would be displayed. I believe in Qt you would use a list view, but how can I use the keys inside my QMap<QString, Person> as a Model? I would maybe have to use a separate QStringListModel and update it accordingly? Should I subclass QAbstractItemModel and create a custom Model for these records? I guess I'm not really sure how professionals create Qt apps that are not trivial demo apps with 2 LineEdits and an "Add" button, where I can just use "Go To Slot" from inside QtDesigner.
Thanks in advance!
-
There are 2 macro frameworks:
QAbstractItemModel
is the dataQAbstractItemModel
is an interface to the data
In the first one you would create a model (using
QStandardItemModel
, for example) to store the data directly. In your case insert 1 column, insert as many rows as you havePerson
s, usesetData
to storeQString
in the DisplayRole andPerson
in the UserRole. In this case you don't need theQMap
, the model already handles your data.The second requires you to keep your data in the
QMap
, subclassQAbstractItemModel
and manually manage events that affect the map. While on paper sounds easy enough, it becomes unmanageable fast when you think that every time you callQMap::erase
you also have to remember to callbeginRemoveRows
/endRemoveRows
.For this reason I personally always use the first way.
I'd be more than happy to hear other opinions on the matter though -
Hi and welcome to devnet,
To add to @VRonin, from what you described, it looks like you should consider using a database. Likely SQLite which is available on all platforms.
In any case, how are you planning to save your user data ? From your description, as soon as the application is exited, you loose everything you have done.
-
Hi and welcome to devnet,
To add to @VRonin, from what you described, it looks like you should consider using a database. Likely SQLite which is available on all platforms.
In any case, how are you planning to save your user data ? From your description, as soon as the application is exited, you loose everything you have done.
@SGaist Aaaah yes I forgot, I just use QDataStream and overload the operator<< for the Person class. I wanted to avoid Databases, because I would have to model it and my experience is limited. The only database experience I have is MySQL and PHP. For me the main reason to not use a database atm is my limited number of entries (likely less than 100, surely less than 1000).
-
@SGaist Aaaah yes I forgot, I just use QDataStream and overload the operator<< for the Person class. I wanted to avoid Databases, because I would have to model it and my experience is limited. The only database experience I have is MySQL and PHP. For me the main reason to not use a database atm is my limited number of entries (likely less than 100, surely less than 1000).
In this case, if you decide to use the first approach, you can use BinaryModelSerialiser to save/load your model
-
There are 2 macro frameworks:
QAbstractItemModel
is the dataQAbstractItemModel
is an interface to the data
In the first one you would create a model (using
QStandardItemModel
, for example) to store the data directly. In your case insert 1 column, insert as many rows as you havePerson
s, usesetData
to storeQString
in the DisplayRole andPerson
in the UserRole. In this case you don't need theQMap
, the model already handles your data.The second requires you to keep your data in the
QMap
, subclassQAbstractItemModel
and manually manage events that affect the map. While on paper sounds easy enough, it becomes unmanageable fast when you think that every time you callQMap::erase
you also have to remember to callbeginRemoveRows
/endRemoveRows
.For this reason I personally always use the first way.
I'd be more than happy to hear other opinions on the matter though@VRonin So I tried the first approach and it works well so far. I want to be able to edit records belonging to each person as well, I will try using a QStringListModel as member of the Person class for that. I understood the 3 different categories described in the Qt YouTube video with (Data/Model/View), (Data/Model->View) and (Data->Model->View) now, too.