任务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实例的更多相关文章

  1. 10.model/view实例(3)

    任务:3x2的表格,第一个单元格显示当前时间 思考: 1.data函数里面QTime::currentTime()显示当前时间 2.但是这个事件是一个固定的时间,不会变动 3.需要时间变动,View就 ...

  2. 10.model/view实例(2)

    任务:显示一个2x3的表格,将表格中的数据显示如下: 思考: 1.如何显示数据和上个例子一样. 2.但是每个单元格的数据都是有角色划分的. Qt::ItemDataRole 3.View从Model中 ...

  3. 10.model/view实例(1)

    1.如图显示一个2x3的表格: 思考: 1.QTableView显示这个表 2.QAbstractTableModel作为模型类. 3.文档中找到subclass的描述 When subclassin ...

  4. 10.model/view实例(4)

    任务:给表单的每一列添加列名. 思考: 1.只需要添加一个函数 headerData(). 横向方面添加列名 代码如下: QVariant MyModel::headerData(int sectio ...

  5. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  6. 3D Computer Grapihcs Using OpenGL - 11 Model View Projection Matrices

    本节我们将绘制一个3维物体,立方体. 如果要渲染3D物体,我们需要了解MVP(Model View Projection),它表示三个转换矩阵.实际上这个名字不够明确,更加确切的释义如下: Model ...

  7. Qt Model/view 小实例 文件目录浏览器

    1. 文件目录浏览器 直接在main.cpp文件中添加下列代码 #include "mainwindow.h" #include <QApplication> #inc ...

  8. MVC(Model View Controller)框架

    MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...

  9. 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

    利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理   2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...

随机推荐

  1. nyoj-211-Cow Contest(floyd算法)

    题目链接 /* Name:nyoj-211-Cow Contest Copyright: Author: Date: 2018/4/27 21:02:06 Description: floyd算法 大 ...

  2. Codeforces Round #260(div2)C(递推)

    有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了 ...

  3. P1605 迷宫(洛谷)

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右 ...

  4. 浅析BMP位图文件结构(含Demo)

    浅析BMP位图文件结构(含Demo) 作者:一点一滴的Beer http://beer.cnblogs.com/   关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为“BMP ...

  5. java代码swing编程JPaswordField类

    总结:JPasswordField类是JTextField类的子类.用户在JPasswordField对象中输入的字符会被其他的字符替代 而挡住,JPasswordFiled组件主要用来输入口令 pa ...

  6. Struts2中web.xml里面struts-cleanup作用

    struts2.1.3之后的版本均不需要配置该过滤器 参考: struts-cleanup作用 升级到struts-2.3.14.3之后涉及的改动以及ActionContextCleanUp,Stru ...

  7. SignalR推送服务在Android的实现 SignalA

    SignalA是老外写的用于实现.net端推送消息至安卓端的实现,支持版本为android 2.3或以上,由于我的版本最低是2.2,所以只有把源码下下来自己改,如果你觉得太多了可自己编译成jar引用, ...

  8. delphi 面向对象实用技能教学二(封装)

    面向对象编程手法,是一项综合技能,单独把谁拿出来说都不合适.本次重写 TSimpleThread ,使其能在 D7 下运行. 基于 TSimpleThread ,重磅推出 TSimpleUI.ExeP ...

  9. intellij idea 设置Live Template快速生成自定义代码块

    一.设置 类似于宏,话不多少,上步骤 File----->Setting 选择Live Template 新建触发规则 新建触发key 输入模版text 选择在哪个环境触发 选java 如果是其 ...

  10. Linux基础命令-文件与目录

    Linux基础命令-文件与目录 参考:<鸟哥linux私房菜>五-七章,17/12/5复习,18/01/15复习 文件权限 rwx421:用户,用户组,其他 umask查看默认权限:000 ...