• 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();
    }
  • 相关阅读:
    ActionResult,PartialViewResult,EmptyResult,ContentResult
    关于控制器
    「6月雅礼集训 2017 Day8」infection
    「6月雅礼集训 2017 Day7」电报
    「6月雅礼集训 2017 Day7」三明治
    「6月雅礼集训 2017 Day7」回转寿司
    「6月雅礼集训 2017 Day5」学外语
    「6月雅礼集训 2017 Day5」仰望星空
    「6月雅礼集训 2017 Day5」吃干饭
    「6月雅礼集训 2017 Day4」寻找天哥
  • 原文地址:https://www.cnblogs.com/billxyd/p/6919175.html
Copyright © 2020-2023  润新知