1. Qt中标准模型定义
(1)预期的模型逻辑结构
(2)代码实现
//main.cpp
#include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
//Widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTableView> #include <QStandardItemModel> class Widget : public QWidget { Q_OBJECT QStandardItemModel m_model; QTableView m_tableView; void initModel(); void initView(); public: Widget(QWidget *parent = 0); ~Widget(); }; #endif // WIDGET_H
//Widget.cpp
#include "Widget.h" #include <QStandardItem> Widget::Widget(QWidget *parent) : QWidget(parent) { initModel(); initView(); m_tableView.setModel(&m_model); } void Widget::initModel() { //获取模型中的根节点 QStandardItem* root = m_model.invisibleRootItem(); //创建3个数据项 QStandardItem* itemA = new QStandardItem(); QStandardItem* itemB = new QStandardItem(); QStandardItem* itemC = new QStandardItem(); //itemA中3个数据地位平等,该显示哪个呢? //解决方案:数据角色,见后面详解 itemA->setData("A"); itemA->setData("Tip A"); itemA->setData("Help A"); //往itemB加入两个数据 itemB->setData("B"); itemB->setData("Tip B"); itemC->setData("C"); itemC->setData("Tip C"); itemC->setData("Help C"); //将数据项加入root中 root->setChild(0, 0, itemA);//第0行0列,取出itemA时按三元组(0,0,root)方式 root->setChild(0, 1, itemB); root->setChild(1, 0, itemC); } void Widget::initView() { m_tableView.setParent(this); m_tableView.move(10, 10); m_tableView.resize(300, 100); } Widget::~Widget() { }
2. 数据角色概念
(1)模型中的数据在视图中的用途可能不同(如用于display或ToolTip等)
(2)模型必须为数据设置特定的数据角色(数据的附加属性)
(3)数据角色用于提示数据在视图中的作用(显示方式)
(4)数据角色是不同视图以统一风格显示数据的标准
3. Qt中的数据角色定义
常量 |
角色定义 |
Qt::DisplayRole |
作为直接可见的显示信息(QString) |
Qt::DecorationRole |
以图标的方式进行显示(QIcon, QPixmap) |
Qt::EditRole |
可编辑的数据信息(QString) |
Qt::ToolTipRole |
悬浮框中的补充型提示信息(QString) |
Qt::StatusTipRole |
在状态中显示的提示性信息(QString) |
Qt::WhatsThisRole |
悬浮框中的详细帮助信息(QString) |
Qt::SizeHintRole |
数据大小信息(QSize) |
4. 数据角色的意义
(1)定义了数据在特定系统下的标准用途
(2)不同的视图可以通过相同标准显示数据。但要注意,数据角色只是一个附加的属性,这个属性代表推荐的数据显示方式,不同视图完全可以自由解析或者忽略数据的角色信息。
【编程实验】数据模型中的角色
//main.cpp
#include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
//Widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTableView> #include <QListView> #include <QTreeView> #include <QStandardItemModel> class Widget : public QWidget { Q_OBJECT QStandardItemModel m_model; QTableView m_tableView; QListView m_listView; QTreeView m_treeView; void initModel(); void initView(); public: Widget(QWidget *parent = 0); ~Widget(); }; #endif // WIDGET_H
//Widget.cpp
#include "Widget.h" #include <QStandardItem> Widget::Widget(QWidget *parent) : QWidget(parent, Qt::WindowContextHelpButtonHint) //用于演示显示Help信息 { initModel(); initView(); //通过不同视图来显示来自同一模型的数据,用于演示模型与视图分离 m_tableView.setModel(&m_model);//用表格显示数据 m_listView.setModel(&m_model); //用列表显示数据 m_treeView.setModel(&m_model); //用树显示数据 } void Widget::initModel() { //获取模型中的根节点 QStandardItem* root = m_model.invisibleRootItem(); //创建4个数据项 QStandardItem* itemA = new QStandardItem(); QStandardItem* itemB = new QStandardItem(); QStandardItem* itemC = new QStandardItem(); QStandardItem* itemChild = new QStandardItem(); //itemA中3个数据(利用数据角色来区别数据在视图中的用途) itemA->setData("A", Qt::DisplayRole); //用来直接显示 itemA->setData("Tip A", Qt::ToolTipRole); //Hint itemA->setData("Help A", Qt::WhatsThisRole); //帮助提示 //往itemB加入两个数据 itemB->setData("B", Qt::DisplayRole); itemB->setData("Tip B", Qt::ToolTipRole); itemC->setData("C", Qt::DisplayRole); itemC->setData("Tip C", Qt::ToolTipRole); itemC->setData("Help C", Qt::WhatsThisRole); itemChild->setData("Child", Qt::DisplayRole); itemChild->setData("Tip Child", Qt::ToolTipRole); itemChild->setData("Help Child", Qt::WhatsThisRole); itemC->setChild(0, 0, itemChild); //将数据项加入root中 root->setChild(0, 0, itemA);//第0行0列,取出itemA时按三元组(0,0,root)方式 root->setChild(0, 1, itemB); root->setChild(1, 0, itemC); } void Widget::initView() { m_tableView.setParent(this); m_tableView.move(10, 10); m_tableView.resize(300, 100); m_listView.setParent(this); m_listView.move(10, 120); m_listView.resize(300, 100); m_treeView.setParent(this); m_treeView.move(10, 230); m_treeView.resize(300, 100); } Widget::~Widget() { }
5. 小结
(1)模型中的数据有附加的角色属性
(2)数据角色定义了数据显示的标准方式
(3)数据角色用于提示视图数据的作用
(4)视图可以自由解析或者忽略数据的角色信息
时间: 2024-10-10 12:50:39