11.树形Model/View实例
任务1:显示如图的树形结构

思考:
1.使用QTreeView显示。
2.Model使用QStandardItemModel,qt的一个标准model。
3.QStandardItemModel下每一个单元都可以看作QStandardItem。
4.QStandardItemModel中invisibleRootItem()函数返回一个看不到的根。
5.在这个根上添加行。
代码如下:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QList> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
Ui::MainWindow *ui;
QList <QStandardItem *> createRow(QString str1, QString str2, QString str3); }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTreeView *treeView = new QTreeView(this);
setCentralWidget(treeView);
QStandardItemModel *model = new QStandardItemModel(this); QStandardItem *root = model->invisibleRootItem(); QList <QStandardItem *> firstRow = createRow("first", "second", "third");
root->appendRow(firstRow); QList <QStandardItem *> secondRow = createRow("", "", "");
firstRow.first()->appendRow(secondRow); treeView->setModel(model);
treeView->expandAll(); } MainWindow::~MainWindow()
{
delete ui;
} QList <QStandardItem *> MainWindow::createRow(QString str1, QString str2, QString str3)
{
QList <QStandardItem *> row; row << new QStandardItem(str1);
row << new QStandardItem(str2);
row << new QStandardItem(str3); return row;
}
main.cpp
#include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}
任务2: 显示如下的树形结构。点击树形下拉单时候,窗口标题显示当前的内容和等级。顶级树形菜单等级1.

思考:
1.如何显示这个树形下拉单和第一个例子一样。
2.点击下拉单时,肯定要触发信号。
3.因为你点击不同的下拉单。选择改变了。这个Model是QItemSelectionModel。通过QTreeView中selectionModel()函数得到。
4.QItemSelectionModel文档中发现信号 selectionChanged()信号。我们设计槽处理这个信号就好了。
5.通过QItemSelectionModel可以得到当前选择的ModelIndex,通过ModelIndex得到内容。
6.通过QItemSelectionModel可以得到当前选择的ModelIndex,如果ModelIndex的parent为空,则是顶级ModelIndex。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QList> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
Ui::MainWindow *ui;
QTreeView * treeView; private slots:
void selectionChangedShot(const QItemSelection & selected,const QItemSelection & deselected ); }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QItemSelectionModel>
#include <QModelIndex> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
treeView = new QTreeView(this);
setCentralWidget(treeView);
QStandardItemModel *model = new QStandardItemModel(this); QStandardItem *root = model->invisibleRootItem(); QStandardItem *USA = new QStandardItem("USA");
QStandardItem *Canada = new QStandardItem("Canada");
QStandardItem *America = new QStandardItem("America");
QStandardItem *Boston = new QStandardItem("Boston");
QStandardItem *Europe = new QStandardItem("Europe");
QStandardItem *Rome = new QStandardItem("Rome");
QStandardItem *Italy = new QStandardItem("Italy");
QStandardItem *Verona = new QStandardItem("Verona"); root->appendRow(America);
root->appendRow(Europe); America->appendRow(Canada);
America->appendRow(USA);
USA->appendRow(Boston); Europe->appendRow(Italy);
Italy->appendRow(Rome);
Italy->appendRow(Verona); treeView->setModel(model);
treeView->expandAll(); QItemSelectionModel *selectionModel = treeView->selectionModel(); connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(selectionChangedShot(QItemSelection, QItemSelection))); } MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::selectionChangedShot(const QItemSelection & selected,const QItemSelection & deselected )
{
QModelIndex index = treeView->selectionModel()->currentIndex();
QString text = index.data(Qt::DisplayRole).toString(); int hierarchy = ;
QModelIndex seekRoot = index;
while(seekRoot.parent() != QModelIndex()) {
hierarchy++;
seekRoot = seekRoot.parent();
} QString title = QString("%1,level%2").arg(text).arg(hierarchy);
setWindowTitle(title);
}
main.cpp
#include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}
11.树形Model/View实例的更多相关文章
- 10.model/view实例(3)
任务:3x2的表格,第一个单元格显示当前时间 思考: 1.data函数里面QTime::currentTime()显示当前时间 2.但是这个事件是一个固定的时间,不会变动 3.需要时间变动,View就 ...
- 10.model/view实例(2)
任务:显示一个2x3的表格,将表格中的数据显示如下: 思考: 1.如何显示数据和上个例子一样. 2.但是每个单元格的数据都是有角色划分的. Qt::ItemDataRole 3.View从Model中 ...
- 10.model/view实例(1)
1.如图显示一个2x3的表格: 思考: 1.QTableView显示这个表 2.QAbstractTableModel作为模型类. 3.文档中找到subclass的描述 When subclassin ...
- 10.model/view实例(4)
任务:给表单的每一列添加列名. 思考: 1.只需要添加一个函数 headerData(). 横向方面添加列名 代码如下: QVariant MyModel::headerData(int sectio ...
- 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)
在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...
- 3D Computer Grapihcs Using OpenGL - 11 Model View Projection Matrices
本节我们将绘制一个3维物体,立方体. 如果要渲染3D物体,我们需要了解MVP(Model View Projection),它表示三个转换矩阵.实际上这个名字不够明确,更加确切的释义如下: Model ...
- Qt Model/view 小实例 文件目录浏览器
1. 文件目录浏览器 直接在main.cpp文件中添加下列代码 #include "mainwindow.h" #include <QApplication> #inc ...
- MVC(Model View Controller)框架
MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
随机推荐
- Linux运维工程师中级面试题
1.解释top命令和vmstat命令 2.请写出iptables语句 3.mysql高可用方案有哪些?mysql备份方案有哪些?有什么缺点? 4.写出Apache 2.x的两种工作模式,以及各自的工作 ...
- python 类的定义和继承
python 2 中类 一.类定义: ? 1 2 class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性如果直接使用类 ...
- THUPC2018 城市地铁规划
$n$ 个点,你可以随意连成一棵树,一个点的贡献为 $F(度数) \space mod \space 59393$ ,$F$ 为给定多项式函数,不超过 $10$ 次 求这 $n$ 个点的最大贡献,和最 ...
- 学习动态性能表(12)--v$db_object_cache
学习动态性能表 第12篇--V$DB_OBJECT_CACHE 2007.6.4 本视图提供对象在library cache(shared pool)中对象统计,提供比v$librarycache更 ...
- 【转】深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- docker 镜像自动升级脚本
#!/bin/bash # Let's finish it like a flash ARGS=`getopt -o v:"$@"` echo $# if [ $# != 2 ]; ...
- 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...
- java代码流类。。程序怎么跟书上的结果不一样???
总结:这个程序很容易懂.的那是这个结果我觉得有问题啊..怎么“stop”后,输出的内容是输入过的呢? 应该是没有关系的呀,与输入的值是不同的....怎么书上运行的结果和我的不一样啊 package c ...
- 西安电子科技大学第16届程序设计竞赛 B Words Game
链接:https://www.nowcoder.com/acm/contest/107/B来源:牛客网 Words Game 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 13107 ...
- Java-API-Package:org.springframwork.transaction.annotation
ylbtech-Java-API-Package:org.springframwork.transaction.annotation 1.返回顶部 1. @NonNullApi @NonNullFie ...