您的位置:首页 > 编程语言 > Qt开发

QT学习2:Table/List/Tree的View,Widget,Model相关

2014-07-15 10:18 471 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: