Model-View及Qt实现#
Model-View-Controller架构最早出现在SmallTalk语言中,至今出现了很多变体。
Model是负责维护数据(如管理数据库),View负责显示与用户交互(如各种界面),Controller将控制业务逻辑。这种分层的做法在大型程序中使得数据、逻辑与界面分离,便于维护更新。
Qt引入了与MVC架构相似的模式Model-View架构,并加入了代理(delegate),用于自定义数据的编辑和渲染。
因为架构中的Model以表格的抽象方式访问数据,事实上并非Model-View的最佳选择。
Qt中Model,View,Delegate均由抽象类定义,并通过信号槽进行交互:
- Model的信号通知View数据发生了改变
- View的信号通知用户交互事件
- Delegate的信号在编辑数据时用于通知Model和View的状态
QAbstractItemModel是所有Model的基类,它定义了View和Delegate访问数据的接口。
模型并不存储数据,而是通过与数据源交互得到数据。数据源包括数据库,文件,内存中的对象以及IO设备。
Qt 内置了许多标准模型:
- QStringListModel:存储简单的字符串列表。
- QStandardItemModel:可以用于树结构的存储,提供了层次数据。
- QFileSystemModel:本地系统的文件和目录信息。
- QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel:存取数据库数据。
如果这些标准模型不能满足需要,可以继承QAbstractItemModel创建新的Model。
QAbstractListModel或QAbstractTableModel提供了一些基本的实现,继承它们可能是更好的选择。
QAbstractItemView是所有View的基类。Qt 还提供了一系列标准的视图:QListView用于显示列表,QTableView用于显示表格,QTreeView用于显示层次数据,它们与List,Table, Tree这些布局在一定程度上对应。
QAbstractItemDelegate则是所有委托的抽象基类。自 Qt 4.4 之后,默认的委托实现是QStyledItemDelegate。但是,QStyledItemDelegate和QItemDelegate都可以作为视图的编辑器,二者的区别在于,QStyledItemDelegate使用当前样式进行绘制。在实现自定义委托时,推荐使用QStyledItemDelegate作为基类,或者结合 Qt style sheets。
QListWidget,QtreeWidget,QTableWidget#
基于MVC架构,Qt提供了QListWidget,QtreeWidget,QTableWidget三个可视化组件,它们均继承了相应的View类,集成了Model-View的功能,程序员可以方便地使用这些类进行开