任务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. Android源代码因删除所有git仓库导致的编译错误

    /******************************************************************************** * Android源代码因删除所有g ...

  2. Arc066_F Contest with Drinks Hard

    传送门 题目大意 有一个长为$N$的序列$A$,你要构造一个长为$N$的$01$序列使得$01$序列全部由$1$组成的子串个数$-$两个序列的对应位置两两乘积之和最大,每次独立的询问给定$pos,x$ ...

  3. python_广州房价热力图

    调用百度地图api,获取经纬度数据,然后在调用百度地图api,生成热力图 import pandas as pd import numpy as np data = pd.read_excel(r'D ...

  4. 1151 LCA in a Binary Tree(30 分)

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  5. SQL夯实基础(六):MqSql Explain

    关系型数据库中,互联网相关行业使用最多的无疑是mysql,虽然我们C# Developer很多用的都是sql server ,但是学习一些mysql方面的知识也是必要的,他山之石么. 先上一个expl ...

  6. JavaWeb框架_Struts2_(二)----->Struts2的核心配置

    2.  Struts2的核心配置 2.1  配置Struts.xml文件 2.1.1 Struts.xml文件 Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和 ...

  7. CF 949C Data Center Maintenance——思路+SCC

    题目:http://codeforces.com/contest/949/problem/C 可以想到可能是每组c有连边的可能. 但别直接给c1.c2连边,那样之后会变得很不好做. 可以把一些限制放在 ...

  8. 关于打包后提示无法连接到mongodb的情况

    昨天晚上要和前端联调. 打完jar包后发现无法连接到测试环境的数据库. 就很尴尬,最后发现问题在于mongodb的URI写错了: 正确的URI格式:mongodb://url:port/dbName ...

  9. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

  10. [转载]proc_mkdir与proc_create

    1:创建proc文件夹struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);参数1:na ...