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 | 分类:代码库 | 评论: ...
随机推荐
- DataTable的用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- 常用集合ArrayList浅度解析
首先,先看一下java中对ArrayList的定义代码: public class ArrayList<E> extends AbstractList<E> implement ...
- 如何去除Linux文件的^M字符
Windows上写好的文件,在Linux或者Unix下打开,每一行都会出多出^M这样的字符,这是因为Windows与*nix的换行符不同所致,我们看看文件格式有什么不同.*注:“^M”,需要使用Ctr ...
- C++中预定义的宏
以下信息摘自与标准C++的文档中. 如果把这些宏加在程序的日志中,它将为开发人员进行问题分析提供了很好的帮助. standard c++ 1998版The following macro names ...
- CodeForces - 891C: Envy(可撤销的并查集&最小生成树)
For a connected undirected weighted graph G, MST (minimum spanning tree) is a subgraph of G that con ...
- MySQL下分页查询数据
-- 分页 -- 前两条 -- 启始位置从下标0开始,查询的是数据库中的第1条开始 -- 0:启始位置 2:一次性查询多少条 select * from account LIMIT 0,2; -- ...
- Cheapest Palindrome(区间DP)
个人心得:动态规划真的是够烦人的,这题好不容易写出了转移方程,结果超时,然后看题解,为什么这些题目都是这样一步一步的 递推,在我看来就是懵逼的状态,还有那个背包也是,硬是从最大的V一直到0,而这个就是 ...
- BZOJ4923 [Lydsy1706月赛]K小值查询
题意 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. \(n \leq 10 ...
- Unity3D自定义资源配置文件
http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在… ...
- XML数据库的尝试
首先祝大家新年快乐.身体健康,平安就是福气. 对于一般的个人迷你项目,数据量不大的时候,完全没有必要使用数据库,管理数据使用XML就可以了. 自己尝试写了一个XML数据库,插入1w条小记录,大概3M大 ...