~adeodato/ code/ minirok/ csl2.blog/ entries/ 2008/ 02/ 19/ Playlist (1): arquitectura modelo/vista

Playlist (1): arquitectura modelo/vista

La versión 4 de Qt (el toolkit gráfico en el que se basa KDE4) introduce como una de sus funcionalidades estrella una arquitectura modelo/vista denominada Interview para los widgets que muestran una lista de ítems, como es el caso de una lista de reproducción.

Brevemente, esta arquitectura de Qt se basa en el patrón de diseño MVC (modelo/vista/controlador), que consiste en la separación de los datos en sí, y toda la lógica para su modificación (modelo), del código encargado de su visualización (vista).

Qt4 no hace obligatorio de este patrón, y proporciona un grupo de clases de conveniencia que se usan de manera muy similar a sus equivalentes en Qt3 (tal y como se usan en la rama estable de Minirok). Así, para la vista en árbol he utilizado una de estas clases de conveniencia, pero para la lista de reproducción me pareció que el uso de este patrón podría ser muy beneficioso (como se verá en próximas entradas).

Qt4 hace la interacción entre la vista y el modelo muy sencilla: el modelo sólo tiene que implementar unos pocos métodos virtuales, y con ellos la vista es capaz de mostrar toda la información sin necesitar código adicional por nuestra parte. Una visión simplificada de estos métodos imprescindibles sería:

  class Playlist(QtCore.QAbstractTableModel):

      def rowCount(self, parent):
          return len(self._items)

      def columnCount(self, parent):
          return len(self._column_names)

      def data(self, index, role):
          if (role == Qt.DisplayRole):
              return self._items[index.row()].tag_by_index(index.column())

      def headerData(self, section, orientation, role):
          if (role == Qt.DisplayRole
                 and orientation == Qt.Horizontal):
              return self._column_names[section]

En una entrada posterior explicaré cómo la vista se comunica con el modelo para realizar las acciones solicitadas por el usuario.