初学者求教QT mvc

初学Qt 2013-08-04 11:29:18
以前根本就没接触过MVC 这类东西 0概念 请教 给为有没有什么书 博文 可以从浅入深的讲解下mvc 赢定要是从浅入深啊 网上找到的一些都是已经默认知道mvc是什么东西了
...全文
253 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
google 下。很多的 http://www.ruanyifeng.com/blog/2007/11/mvc.html
青松2 2013-08-04
  • 打赏
  • 举报
回复
mvc是经典的三层结构,将数据,视图和逻辑分离。Qt中的Model/View框架,实现了这个模式。在Qt中这个模式设计到三个类,model类,view类和delegate类。model类保存数据,view复制显示,而delegate负责协调model和view之间的数据edit(编辑)和render(渲染)。 这些在model子类中需要实现的方法可以分为三组。 项数据绑定:所有的model需要实现方法使视图和代理能够查询model... Models能够提供各种程度的数据访问限制:read-only,resizing,edited Read-Only access 只读访问 如果只读访问,只需要实现下面几个函数在继承的子类中 Flags,其他的组件可以通过这个得知每个Item的信息,在大多数的models中,包含Qt::ItemIsEnable,Qt::ItemIsSelectable data,被用来提供数据给视图和代理,一般的,models只要提供Qt::DisplayRole和任何程序特殊的角色,也有一些特殊的Qt::ToolTipRole等,详细可以看Qt::ItemDataRole。 headerData,为视图的头部提供信息数据。 rowCount提供这个model有多少行数据。 上述的四个函数在任何类型的model中都要实现,不管是QAbstractListModel还是QAbstractTableModel。另外,下面的函数必须被实现,在QAbstractTableModel和QAbstractItemModel中,columnCount。 编辑项目 可编辑的模型允许数据项被修改,和可以提供函数来插入数据在行和列。 Flags,必须包含Qt::ItemDataRole。 setData,被用来修改和特殊的模型索引相关的项目。修改的数据必须是Qt::EditRole,发送一个dataChanged信号。 setHeaderData,用来修改水平和垂直的头信息,发出一个headerDataChanged信号。 改变models的size 所有类型的model能够提供插入和移除行。Table Model和分级的model也支持列的插入和删除操作。 下面的例子是基于QAbstractListModel实现的一个QStringListModel [cpp] view plaincopyprint? /************************************************ * *author:周翔 *e-mail:604487178@qq.com *blog:http://blog.csdn.net/zhx6044 * * *************************************************/ #ifndef STRINGLISTMODEL_HPP #define STRINGLISTMODEL_HPP #include <QAbstractListModel> #include <QStringList> class StringListModel : public QAbstractListModel { Q_OBJECT public: explicit StringListModel( const QStringList &stringList, QObject *parent = 0); //重新实现的函数 int rowCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role); signals: public slots: private: QStringList m_slist;//存放数据的容器 }; #endif // STRINGLISTMODEL_HPP /************************************************ * *author:周翔 *e-mail:604487178@qq.com *blog:http://blog.csdn.net/zhx6044 * * *************************************************/ #include "stringlistmodel.hpp" #include <QDebug> StringListModel::StringListModel(const QStringList &stringList, QObject *parent) : QAbstractListModel(parent), m_slist(stringList) { } /** * @brief StringListModel::rowCount model数据的行数 * @return */ int StringListModel::rowCount(const QModelIndex &/*parent*/) const { return m_slist.length();//就是链表的长度 } /** * @brief StringListModel::data 获得对应index项的数据 * @param index * @param role 数据的角色 * @return */ QVariant StringListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } //row从0开始,有效的范围为0~链表长度减1 if (index.row() >= m_slist.length()) { return QVariant(); } if (role == Qt::DisplayRole) { return m_slist.at(index.row()); } else { return QVariant(); } } QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { return QString("col %1").arg(section); } else { return QString("row %1").arg(section); } } /** * @brief StringListModel::flags 被其他组件访问时获得每个Item的信息 * @param index * @return */ Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const { if (!index.isValid()) { return Qt::ItemIsEnabled; } return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;//可编辑的 } /** * @brief StringListModel::setData 当视图的显示的数据被改变的时候,model也相应的改变 * @param index * @param value * @param role * @return */ bool StringListModel::setData(const QModelIndex &index, const QVariant &value, int role) { //这个index必须是有效的,必须还是可编辑的 if (index.isValid() && role == Qt::EditRole) { m_slist.replace(index.row(),value.toString()); emit dataChanged(index,index);//发出这个信号,外部使用这个信号没用 return true; } return false; } /************************************************ * *author:周翔 *e-mail:604487178@qq.com *blog:http://blog.csdn.net/zhx6044 * * *************************************************/ #ifndef STRINGLISTMODEL_HPP #define STRINGLISTMODEL_HPP #include <QAbstractListModel> #include <QStringList> class StringListModel : public QAbstractListModel { Q_OBJECT public: explicit StringListModel( const QStringList &stringList, QObject *parent = 0); //重新实现的函数 int rowCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role); signals: public slots: private: QStringList m_slist;//存放数据的容器 }; #endif // STRINGLISTMODEL_HPP /************************************************ * *author:周翔 *e-mail:604487178@qq.com *blog:http://blog.csdn.net/zhx6044 * * *************************************************/ #include "stringlistmodel.hpp" #include <QDebug> StringListModel::StringListModel(const QStringList &stringList, QObject *parent) : QAbstractListModel(parent), m_slist(stringList) { } /** * @brief StringListModel::rowCount model数据的行数 * @return */ int StringListModel::rowCount(const QModelIndex &/*parent*/) const { return m_slist.length();//就是链表的长度 } /** * @brief StringListModel::data 获得对应index项的数据 * @param index * @param role 数据的角色 * @return */ QVariant StringListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } //row从0开始,有效的范围为0~链表长度减1 if (index.row() >= m_slist.length()) { return QVariant(); } if (role == Qt::DisplayRole) { return m_slist.at(index.row()); } else { return QVariant(); } } QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { return QString("col %1").arg(section); } else { return QString("row %1").arg(section); } } /** * @brief StringListModel::flags 被其他组件访问时获得每个Item的信息 * @param index * @return */ Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const { if (!index.isValid()) { return Qt::ItemIsEnabled; } return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;//可编辑的 } /** * @brief StringListModel::setData 当视图的显示的数据被改变的时候,model也相应的改变 * @param index * @param value * @param role * @return */ bool StringListModel::setData(const QModelIndex &index, const QVariant &value, int role) { //这个index必须是有效的,必须还是可编辑的 if (index.isValid() && role == Qt::EditRole) { m_slist.replace(index.row(),value.toString()); emit dataChanged(index,index);//发出这个信号,外部使用这个信号没用 return true; } return false; } 使用这个model类 [cpp] view plaincopyprint? StringListModel *model = new StringListModel(QStringList() << "chenchen" << "love" << "zhou xiang",this); ui->listView->setModel(model);
为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery类执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)

16,817

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧