By separating content from appearance, the model/view framework takes a divide and conquer approach to GUI design. That is, the appearance of the data on the screen, handled by the view, is managed separately from the application's interactions with the data store. Such data wrangling is handled by the model.[1] This division of labor makes both of their jobs simpler: the view can ignore the details of how data are handled by the model, while the model can ignore the details of how data are painted to the screen.
As illustrated in Figure 1, views have two main roles:
- Get data from the model by sending the
model queries.
Figure 1: The model/view framework - Paint the GUI to the screen: the same content can be viewed as a list, table, or a hierarchically organized tree. These different types of views are instances of QListView, QTableView, and QTreeView, respectively.[2]
Models also have two main roles:
- Handle all direct interactions with the data store, wrapping data into indexes to be used by the view.
- Implement the expected interface with the view: when the view needs data, we know that the model will provide it using the mandatory interface.
While models and
views are equally important, in this tutorial we will focus mainly on how to
implement a model. The view class we will use is the factory-made QTreeView, whose default behavior will be fine for our
purposes.
As mentioned above, all models are
expected to instantiate a certain interface (or API) for the view to use. This API
consists of a set of methods that provide views with all the information they
need to paint the GUI to the screen. For instance, by invoking the model's data() method, we will see that the view can determine what text
needs to be displayed on the screen. One nice feature of the standard views is
that they will only request data about items in the model that presently need
to be drawn to the screen.
The
complexity of the model's API depends on the type of model you want to create.
The simplest read-only list models only need to provide two methods: data()
and rowCount(). More complex models, such as editable tree
models, need to provide many additional methods. For a helpful overview of the methods required for different types of models,
see Qt's Model subclassing reference
(http://qt-project.org/doc/qt-4.8/model-view-programming.html#model-subclassing-reference).
If this all seems a bit abstract and useless or confusing, don't spend a lot of time struggling over the details. You will get lots of concrete examples in Part II, which is really the meat of this Tutorial.
[1] Note to keep things simple we will ignore the existence of delegates in
this synopsis. Delegates control the display of individual data items and
editors for said items, but for now we'll just lump this in as part of the
view.
[2]
For less standard visual representations of data (e.g., a bar graph or pie
chart) you would need to make a custom view (Summerfield (2008), Chapter 16).
No comments:
Post a Comment