zoukankan      html  css  js  c++  java
  • (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五)

    View 类

    概念

    在model/view架构中,view从model中获得数据项然后显示给用户。数据显示的方式不必与model提供的表示方式相同,可以与底层存储数据项的数据结构完全不同。

    内容与显式的分离是通过由QAbstractItemModel提供的标准模型接口,由QAsbstractItemview提供的标准视图接口共同实现的。普遍使用model index来表示数据项。view负责管理从model中读取的数据的外观布局。

    它们自己可以去渲染每个数据项,也可以利用delegate来既处理渲染又进行编辑。

    除了显示数据,views也处理数据项的导航,参与有关于数据项选择的部分功能。view也实现一些基本的用户接口特性,如上下文菜单与拖拽功能。view也为数据项提供了缺省的编程功能,也可搭配delegate实现更为特殊的定制编辑的需求。

    一个view创建时必不需要model,但在它能显示一些真正有用的信息之前,必须提供一个model。view通过使用

    selections来跟踪用户选择的数据项。每个view可以维护单独使用的selections,也可以在多个views之间共享。有些views,如QTableView和QTreeView,除数据项之外也可显示标题(Headers),标题部分通过一个view来实现,QHeaderView。标题与view一样总是从相同的model中获取数据。从 model中获取数据的函数是QabstractItemModel::headerDate(),一般总是以表单的形式中显示标题信息。可以从QHeaderView子类化,以实现更为复杂的定制化需求。

    使用现成的view

    Qt提供了三个现成的view 类,它们能够以用户熟悉的方式显示model中的数据。QListView把model中的数据项以一个简单的列表的形式显示,或是以经典的图标视图的形式显示。QTreeView把model中的数据项作为具有层次结构的列表的形式显示,它允许以紧凑的深度嵌套的结构进行显示。QTableView却是把model中的数据项以表格的形式展现,更像是一个电子表格应用程序的外观布局。

    QTreeView - zhengjiu_520 - !snows snowy world!

    以上这些标准view的行为足以应付大多数的应用程序,它们也提供了一些基本的编辑功能,也可以定制特殊的需求。

    使用model

    以前的例子中创建过一个string list model,可以给它设置一些数据,再创建一个view把model中的内容展示出来:

    int main(int argc, char *argv[])

     {

       QApplication app(argc, argv);

     // Unindented for quoting purposes:

     QStringList numbers;

     numbers << "One" << "Two" << "Three" << "Four" << "Five";

     QAbstractItemModel *model = new StringListModel(numbers);

     //要注意的是,这里把StringListModel作为一个QAbstractItemModel来使用。这样我们就可以

     //使用model中的抽象接口,而且如果将来我们用别的model代替了当前这个model,这些代码也会照样工作。

     //QListView提供的列表视图足以满足当前这个model的需要了。

     QListView *view = new QListView;

     view->setModel(model);

      view->show();

      return app.exec();

    }

    QTreeView - zhengjiu_520 - !snows snowy world!

    view会渲染model中的内容,通过model的接口来访问它的数据。当用户试图编辑数据项时,view会使用缺省的delegate来提供一个编辑构件。

    一个model,多个views

    为多个views提供相同的model是非常简单的事情,只要为每个view设置相同的model。

         QTableView *firstTableView = new QTableView;

         QTableView *secondTableView = new QTableView;

         firstTableView->setModel(model);

         secondTableView->setModel(model);

    在model/view架构中信号、槽机制的使用意味着model中发生的改变会传递中联结的所有view中,这保证了

    不管我们使用哪个view,访问的都是同样的一份数据。

    QTreeView - zhengjiu_520 - !snows snowy world!

    上面的图展示了一个model上的两个不同的views,尽管在不同的view中显示的model中的数据是一致的,每个

    view都维护它们自己的内部选择模型,但有时候在某些情况下,共享一个选择模型也是合理的。

    处理数据项的选择

    view中数据项选择机制由QItemSelectionModel类提供。所有标准的view缺省都构建它们自己的选择模型,

    以标准的方式与它们交互。选择模型可以用selectionModel()函数取得,替代的选择模型也可以通过

    setSelectionModel()来设置。当我们想在一个model上提供多个一致的views时,这种对选择模型的控制能力非常有用。通常来讲,除非你子类化一个model或view,你不必直接操纵selections的内容。

    多个views之间共享选择

    接着上边的例子,我们可以这样:

    secondTableView->setSelectionModel(firstTableView->selectionModel());

    现在所有views都在同样的选择模型上操作,数据与选择项都保持同步。

    QTreeView - zhengjiu_520 - !snows snowy world!

    上面的例子中,两个view的类型是相同的,假如这两个view类型不同,那么所选择的数据项在每个view

    中的表现形式会有很大的不同。例如,在一个table view中一个连续的选择,在一个tree view中表现出

    来的可能会是几个高亮的数据项片断的组合。

  • 相关阅读:
    开源ITIL管理软件iTop 2.5-2.6安装
    并发服务器
    套接字通信
    libevent
    gdb调试
    值得收藏的技术社区
    关于博客园随笔编辑页面内容不刷新(空白)的问题解决
    嵌入式Web框架
    内存地址的传递问题
    linux文件缓冲区
  • 原文地址:https://www.cnblogs.com/takeaction/p/3662267.html
Copyright © 2011-2022 走看看