首页 > 其他分享 >(四)视图类

(四)视图类

时间:2023-10-28 12:01:30浏览次数:27  
标签:显示 模型 视图 选择 QTableView 使用

1.基本概念

在模型/视图架构中,视图从模型中获取数据项并将它们呈现给用户。数据的表示方式不必与模型提供的数据表示形式相似,而且可能与用于存储数据项的底层数据结构完全不同。

通过使用QAbstractItemModel提供的标准模型接口和QAbstractItemView提供的标准视图接口,以及使用通用方式表示数据项的模型索引,实现了内容与表现的分离。视图通常管理从模型中获得的数据的总体布局。它们可以自己渲染单个数据项,或者使用委托来处理渲染和编辑功能。

除了显示数据,视图还处理项目之间的导航,以及项目选择的一些方面。这些视图还实现了基本的用户界面功能,例如上下文菜单和拖放。视图可以为项目提供默认的编辑功能,也可以与委托一起提供自定义编辑器。

可以在没有模型的情况下构建视图,但是必须提供模型才能显示有用的信息。视图通过使用可以为每个视图单独维护或在多个视图之间共享的选择项来跟踪用户选择的项目。

有些视图,如QTableView和QTreeView,显示标题和项目。这些也由一个视图类QHeaderView实现。标题通常访问包含它们的视图的同一个模型。它们使用QAbstractItemModel::headerData()函数从模型中获取数据,并且通常以标签的形式显示标题信息。新的标题可以从QHeaderView类子类化,为视图提供更专门的标签。

2.使用已存在的视图

Qt提供了三个可用的视图类,它们以大多数用户熟悉的方式呈现模型中的数据。QListView可以将模型中的项目显示为简单的列表,或者以经典图标视图的形式显示。QTreeView将模型中的项目显示为列表的层次结构,允许以紧凑的方式表示深度嵌套结构。QTableView以表格的形式呈现模型中的项目,很像电子表格应用程序的布局。

上面显示的标准视图的默认行为应该足以满足大多数应用程序。它们提供基本的编辑功能,并可以进行定制以适应更专业的用户界面的需求。

使用模型

我们将创建的字符串列表模型作为示例模型,在其中设置一些数据,并构建一个视图来显示模型的内容。这些都可以在一个函数中完成:

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。这允许我们使用模型的抽象接口,并确保代码仍然有效,即使我们将字符串列表模型替换为不同的模型。

QListView提供的列表视图足以显示string列表模型中的项目。我们使用下面的代码来构建视图和建立模型:

QListView *view = new QListView;

view->setModel(model);

视图按正常方式显示:

view->show();

    return app.exec();

}

视图渲染模型的内容,通过模型的接口访问数据。当用户试图编辑项时,视图使用默认委托来提供编辑器部件。

(四)视图类_Qt

上图显示了QListView如何表示字符串列表模型中的数据。由于模型是可编辑的,视图自动允许使用默认委托编辑列表中的每一项。


使用模型的多个视图

为同一个模型提供多个视图,只需为每个视图设置相同的模型即可。在下面的代码中,我们创建了两个表视图,每个都使用了我们为这个例子创建的相同的简单表模型:

QTableView *firstTableView = new QTableView;
QTableView *secondTableView = new QTableView;
firstTableView->setModel(model);
secondTableView->setModel(model);

在模型/视图架构中使用信号和槽意味着对模型的更改可以传播到所有附加的视图,确保我们始终可以访问相同的数据,无论使用的是哪个视图。

(四)视图类_Qt_02

上图显示了同一个模型的两个不同视图,每个视图都包含一些选中的项目。尽管来自模型的数据在整个视图中一致地显示,但每个视图都维护自己的内部选择模型。这在某些情况下可能有用,但对于许多应用程序来说,共享选择模型是可取的。

3.处理元素的选择

在视图中处理元素选择的机制由QItemSelectionModel类提供。所有的标准视图都默认构建自己的选择模型,并以正常的方式与它们交互。视图使用的选择模型可以通过selectionModel()函数获得,而替换选择模型可以通过setSelectionModel()指定。当我们想为同一个模型数据提供多个一致的视图时,控制视图使用的选择模型的能力很有用。

一般来说,除非是模型或视图的子类化,否则不需要直接操作选择的内容。不过,如果需要的话,选择模型的接口也是可以访问的,我们会在12.4.3节中讨论如何处理Item视图中的选择。

视图间共享选择

虽然视图类默认提供自己的选择模型很方便,但当我们在同一个模型上使用多个视图时,通常希望模型的数据和用户的选择在所有视图中都保持一致。由于视图类允许替换它们的内部选择模型,我们可以使用以下代码实现视图之间的统一选择:

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

第二个视图是第一个视图的选择模型。这两个视图现在都在同一个选择模型上操作,保持数据和所选项目同步。

在上面的示例中,使用了相同类型的两个视图来显示相同模型的数据。然而,如果使用了两种不同类型的视图,则所选择的项目在每个视图中可能表现得非常不同;例如,表视图中的连续选择可以表示为树视图中高亮显示的项目的片段集。

标签:显示,模型,视图,选择,QTableView,使用
From: https://blog.51cto.com/u_16324960/8068922

相关文章

  • iOS 父视图设置阴影 并且内部的子视图左右下边设置圆角
    给视图设置阴影的时候无法使用masksToBounds=YES,否则阴影也会被截取掉,将无法看到阴影效果如上图中所示,弹窗中每个item是一个类似card的效果,内部包含选择框和下面的轮播图,给item设置阴影后发现下边的轮播图超出部分还是直角效果,这样很不好看,所有这里通过单独给轮播图设置mark来实......
  • iOS 解决父视图点击事件导致子视图事件不触发
    如图,是蓝色父视图blueView添加tap事件,内部红色子视图redView的tap事件将会无法触发解决办法UITapGestureRecognizer*tap=[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(itemCLick)];tap.delegate=self;[self.blueViewaddGestureRecogni......
  • Qt开发之图形视图
    一、GraphicsView框架结构Qt的GraphicsView框架是一个用于2D图形渲染和交互的框架,它为开发者提供了一种灵活的方式来创建自定义的图形界面和场景。以下是QtGraphicsView框架的主要组件和结构分析:场景(Scene):QGraphicsScene是GraphicsView的核心概念之一。场景充当图形项(Item)的......
  • oracle-视图
    视图视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成的。视图是oracle又一个数据对象,其主要作用是简化操作,提高安......
  • Windows打开任务视图快捷键
    同时按下win+Tab效果如下:这时鼠标就可以选中想要打开的视图,点击鼠标左键就可以快速跳转到想要去的应用了......
  • 编辑器Scene视图扩展 - Handles.Slider2D
    效果 #ifUNITY_EDITORusingUnityEditor;usingUnityEngine;publicclassTestSceneGUIWindow:EditorWindow{[MenuItem("MyTools/TestSceneGUIWindow")]publicstaticvoidShowWindow(){EditorWindow.GetWindow<TestSceneGU......
  • 编辑器扩展 - Scene视图
    扩展Scene视图的几种方式1)注册SceneView.duringSceneGui委托(Unity2018及之前版本是SceneView.onSceneGUIDelegate)#ifUNITY_EDITORusingUnityEditor;publicclassTestSceneGUIWindow:EditorWindow{[MenuItem("MyTools/TestSceneGUIWindow")]publicstatic......
  • huawei交换机基本配置,入门视图详解
    一、交换机基本配置1、交换机连接方式本地:计算机COM口/USB口-->Console线-->交换机Console口远程:Putty、SecureCRT、Xshell远程管理工具2、网络操作系统1)有四种视图模式<*> //用户视图:查看运行状态或其他参数[*] //系统视图:配置设备的系统参数[*-GigabitEthernet0/0......
  • python 处理异步物化视图同时执行导致内存溢出问题
    python处理异步物化视图同时执行导致内存溢出问题一、前提:因为物化视图过多,同时物化视图到时间同时爆发,导致CPU爆满,所以采用datax自带的调度服务来执行python命令二、直接看代码:importpymysqlimportpymssqlimportdatetimeimporttimeclassMaterialized_plan:d......
  • sortable 拖拽后数据变更但视图不变
    问题表格中某两行拖拽换序,使用sortable.js在拖拽结束后调用换序接口,再更新数据列表。问题是数据变了,但视图不变。如下图所示:分析vue无法检测数组中顺序的变化。即使采用$set,$forceUpdate(),给组件添加key属性,仍然无法解决该问题。解决办法请求数据列表前,先重置列表。......