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 = 0);
    ~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("111", "222", "333");
    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 = 0);
    ~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 = 1;
    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();
}
时间: 2024-12-16 11:53:43

11.树形Model/View实例的相关文章

10.model/view实例(2)

任务:显示一个2x3的表格,将表格中的数据显示如下: 思考: 1.如何显示数据和上个例子一样. 2.但是每个单元格的数据都是有角色划分的. Qt::ItemDataRole 3.View从Model中获取数据,通过data函数.每一个单元格根据角色,调用多次data函数.个人理解:单元格什么角色都调用一次data函数. 代码如下:就是修改data函数的代码. QVariant MyModel::data(const QModelIndex &index, int role) const { in

10.model/view实例(4)

任务:给表单的每一列添加列名. 思考: 1.只需要添加一个函数 headerData(). 横向方面添加列名 代码如下: QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const { if(role == Qt::DisplayRole) { if(orientation == Qt::Horizontal) { switch (section) { case 0: return

QT开发(三十八)——Model/View框架编程

QT开发(三十八)--Model/View框架编程 一.自定义模型 1.自定义只读模型 QAbstractItemModel为自定义模型提供了一个足够灵活的接口,能够支持数据源的层次结构,能够对数据进行增删改操作,还能够支持拖放.QT提供了 QAbstarctListModel和QAbstractTableModel两个类来简化非层次数据模型的开发,适合于结合列表和表格使用. 自定义模型需要考虑模型管理的的数据结构适合的视图的显示方式.如果模型的数据仅仅用于列表或表格的显示,那么可以使用QAbs

QT开发(三十六)——Model/View框架

QT开发(三十六)--Model/View框架 一.Model/View框架简介 1.Model/View框架核心思想 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存储. Model/View框架中数据与显示的分离,可以允许使用不同界面显示同一数据,也能够在不改变数据的情况下添加新的显示界面.为了处理用户输入,引入了委托(delegate).引入委托的好处是可以自定义数据项的渲

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

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论:0 | 浏览:45 | 该类在MVC中可以方便管理配置信息,可以直接把Model储存进数据库或者从数据库去除数据转为Model. 1 何为配置项目? 比如网站的名称,页脚信息,meta中的KeyWord信息等,如果不想硬编码到网页里,就需要使用配置文件进行储存,通常都是储存到数据库中.使用的时候读取出来

Qt Model/View(转)

介绍 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提 供一个标准的model接口,使得更多的数据源可以被这些item view使用.这里对model/view的结构进行了描述,结构中的每个组件都进行了解释,给出了一些例子说明了提供的这些类如何使用. Model/View 结构 Model-View-Controller(MVC), 是从Smalltalk发展而来的一种

spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程

整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet第二步:通过request从Controller获取ModelAndView.现在来讲解第三步:request 从ModelAndView中获取view对象. 获取view对象一般是通过viewResolver来解析view name来完成的.若ModelAndView中view 不存在或者ModelAndView本身为null则填充默认值.代码如下: ModelAndView中view 不存在或者Mod

20170901 django流程之模板, model以及实例

20170901 django流程之model以及实例 .wiz-code-container { position: relative; padding: 8px 0; margin: 5px 25px 5px 5px; text-indent: 0 } .CodeMirror { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; color: black; font-size: 0.83rem

Qt Model/View( 一)

http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接口,使得更多的数据源可以被这些item view使用.这里对model/view的结构进行了描述,结构中的每个组件都进行了解释,给出了一些例子说明了提供的这些类