1. TableWidget/ListWidget/TreeWidget是简化版的控件,放上界面后通过addItem/setItem等就可以实现简单的数据界面效果,但是无法对item进行比较深度的定制
2.TableView/ListView/TreeView 是高级版的控件,可以做更多的定制,它遵循的是model/view模式,
类似于android的view-->adapter-->数据源的机制,界面做好一个Table/List/Tree的View控件,然后再把数据源的每一项和item做绑定,
(也许是没怎么写过c++,所以觉得QT的model/view要比android的复杂庞大一点)
以model来作为界面和数据源的"中介",程序在更新数据源的同时可以通过model类的函数把数据更新同步到界面,
用户修改view里面的item后,也可以通过model类的函数把操作和修改保存到数据源
3.例子
QT的demo里以TableView做例子,数据源用内存里的一个 QList<QPair<QString, QString> > listOfPairs , QPair里面存的是电话谱的"人名-->地址" 对。
(注意QModelIndex这个类: 每一个item在它所在的view里面都有它的位置,比如在TableView里使用"行号,列号"来确定一个item的位置,那么这个位置可以用一个QModelIndex对象来表示)
实现步骤大概是这样子:
1.确定数据源,比如一个 QList<QPair<QString, QString> > (N行两列的string表格)
2.写一个或者直接在界面上拖一个TableView
3.建立一个model,比如写一个TableModel类来继承QAbstractTableModel,来扮演一个model角色,继承重写QAbstractTableModel的几个函数,以实现:
(0) 定义table表格的表头(横向和纵向)的内容:通过headerData()函数
(1) 数据源增删改以后能通过model同步刷新到view: 通过data()函数,将数据源的数据 对应到 view中某个index位置上
(2) 用户修改view上的item数据,能同步到数据源:通过setData()函数, 或者可以自己写一个信号槽,然后直接修改数据源,setData()主要是提供了index 和emit(dataChanged())信号
(3)
参考:
Qt Model/View 学习笔记 (四) http://www.cppblog.com/yuanyajie/archive/2007/06/18/26555.html
QT QTableWidget 用法总结 (selectionMode相关) http://blog.csdn.net/polokang/article/details/6696982
Qt的Model/View Framework解析 http://blog.csdn.net/superjoel/article/details/5112120
Qt 的Model/View http://blog.csdn.net/zhenwo123/article/details/12169135
(未完)
4.关于model与proxyModel
我在tableview界面上塞了一些数据,为了能监听到用户点击了那个单元格,可以重写tableView的clicked信号槽,
但是同时我又希望能够在用户点击表格头的时候对表格进行排序,
于是仿照qt的demo里面的addressbook做了一个QSortFilterProxyModel,然后再proxyModel.setSourceModel( QAbstractTableModel ),在model上又加了一层model
这样就有问题,鼠标点击tableView的某个单元格的时候,clicked信号槽会传一个ModelIndex,可是我的tableView已经手动排序了,界面上数据的顺序不是最开始的顺序了,
那这个ModelIndex是QSortFilterProxyModel的呢?还是 QAbstractTableModel 的呢?
答案是什么我也没细究,因为QSortFilterProxyModel提供了mapToSource(), mapFromSource(), mapSelectionToSource(), 和mapSelectionFromSource()这些方法.
所以我把index一个个传进这些方法,得到我真正想要的modelIndex。 (深深佩服 qt 的巧妙设计)
附图:(点击'序号'排序后不再是以1开头了,而我要的index的row是sourceModel的9而不是proxyModel的1)
参考文章:
QSortFilterProxyModel Class http://blog.csdn.net/wavelee/article/details/8978184
5.毕设里用到了qt的qwebview,但是qt5用qwebview时要引入的头文件和以前的不一样,参考网上的说法:
“
使用到QWebPage等webkit相关可视部件的,Qt5单独放到了QtWebKitWidgets模块中,所以得加头文件#include <QtWebKitWidgets>,在.pro中要加QT += webkitwidgets
”
最后我在.pro中要加QT += webkitwidgets, 然后#include <QWebView>,最后编译终于成功
6.关于tableWidget的一些资料
http://book.51cto.com/art/201203/323449.htm
http://book.51cto.com/art/201203/323450.htm