(三十五)Model/View Programming

QT模型/视图编程:Model/View Programming 模型/视图编程简介 Qt包含一组项目视图类,这些类使用模型视图体系结构来管理数据之间的关系,以及向用户呈现数据的方式。 模型/视图体系结构 模型视图控制器 (MVC) 是一种源自 Smalltalk 的设计模式,在构建用户界面时通常使用。 MVC 由三种对象组成。模型是应用程序对象,View 是它的屏幕表示,控制器定义用户界面对用户输入的反应方式。在 MVC 之前,用户界面设计倾向于将这些对象混为一谈。MVC 将它们分离,以提高灵活性和重用性。 这种分离使得可以在几个不同的视图中显示相同的数据,并实现新的视 阅读详情

Qt官方文档Model/View Programming

一、Model/View架构简介

    Qt4推出了一套新的项视图类,它使用Model/View架构来管理数据与表示层的关系。Model/View架构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,并且他还提供一个标准的model接口,使得更多的数据源可以被项视图类使用。本文简要介绍了Model/View架构,对涉及的概念做了简单的概述,阐述了项视图系统。架构中的每一个组件都将一一作出解释,同时将用实例对如何使用这些类进行说明。

1、Model/View架构简介

    Model-View-Controller(MVC), 是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。在设计模式中对MVC模式的描述如下:MVC由3种对象组成:模型是应用程序对象,视图是它的屏幕显示方式,控制器定义用户接口对用户输入反应的方式。在MVC设计模式之前,用户界面设计倾向于三者揉合在一起,MVC对它们进行了解耦,提高了灵活性与重用性。

    MVC 由三种对象组成,Model负责维护数据(如管理数据库),View负责显示及与用户交互(如各种界面),Controller控制业务逻辑。如果把View与Controller结合在一起,结果就是Model/View架构。Model/View架构依然是把数据存储与数据表示进行了分离,与MVC都基于同样的思想,但更简单。数据存储与数据显示的分离使得在几个不同的View上显示同一个数据成为可能,也可以在改变底层的数据结构的情况下重新实现新的View。为了更灵活的对用户输入进行处理,引入了Delegate,使得数据项的渲染与编辑可以进行定制。


    Model负责与数据源通讯,并提供接口给架构中的别的组件使用。通讯的实质依赖于数据源的类型与Model实现的方式。

    View从Model获取模型索引,模型索引是数据项的引用。通过把模型索引提供给Model,View可以从数据源中获取数据。

    在标准的Views中,Delegate渲染数据项,当某个数据项被编辑时,Delegate通过模型索引与Model直接进行交互。Model/View相关类可以被分成上面所提到的三组:Models,Views,Delegates。这些组件通过抽象类来定义,抽象类提供了共同的接口,在某些情况下,还提供了默认的实现。抽象类意味着需要子类化,以便为其他组件提供完整的功能,同时也可以用来实现定制的组件。

    Models、Views、Delegates之间通过信号-槽机制来进行通讯:

l  从Model发出的信号通知View关于数据源中的数据发生的改变。

l  从View发出的信号提供了有关被显示的数据项与用户交互的信息。

l  从Delegate发射的信号被用于在编辑时通知Model和View关于当前编辑器的状态信息。

    Model/View架构中,所有模型类具有共同的抽象基类QAbstractItemModel,所有视图类具有共同的抽象基类QAbstractItemView,所有委托类具有共同的抽象基类QabstractItemDelegate。

2、Models

所有的Models都基于QAbstractItemModel类,QAbstractItemModel类定义了用于Views和Delegates访问数据的接口。数据本身不是必需存储在Model,也可存储在一个数据结构或另外的类、文件、数据库或别的程序组件中。
    QAbstractItemModel提供给数据一个接口,它足够灵活,足以满足Views对数据的显示,无论数据用以下何种形式表现:tables、lists、trees。然而,当重新实现一个Model时,如果Model基于table或list形式的数据结构,最好以QAbstractListModel与QAbstractTableModel为起点,因为它们提供了适当的常规功能的缺省实现。这些类可以被子类化以支持特殊的定制需求。子类化model的过程在Create New Model部分讨论
    QT提供了一些现成的Models用于处理数据项:

l  QStringListModel:用于存储简单的QString列表。

l  QStandardItemModel :管理复杂的树型结构数据项,每项都可以包含任意数据。

l  QDirModel :提供本地文件系统中的文件与目录信息。

l  QSqlQueryModel、QSqlTableModel、QSqlRelationTableModel:用来访问数据库。

当标准Model不能满足需要时,可以子类化QAbstractItemModel,QAbstractListModel或是QAbstractTableModel来定制自己的Model。

3、Views

    不同的View都完整实现了各自的功能:QListView把数据显示为一个列表,QTableView把Model中的数据以表格的形式表现,QTreeView用具有层次结构的列表来显示Model中的数据。QListView、QTableView、QTreeView都基于QAbstractItemView抽象基类,虽然他们都被完整的实现,但仍然可以用于子类化以便满足自定义视图的需求。

4、Delegates

    QAbstractItemDelegate是Model/View架构中的用于Delegate的抽象基类。从Qt4.4开始,默认委托实现由 QStyledItemDelegate提供,并且它被作为Qt标准视图的默认委托来使用,但是,QStyledItemDelegate 和 QItemDelegate是为视图项提供绘制和编辑器的两个独立的委托。他们之间的不同在于,QStyledItemDelegate使用当前的样式来绘制它的项。因此在实现自定义委托或使用Qt样式表时,我们建议使用QStyledItemDelegate作为基类。

5、排序

    在model/view架构中,有两种方法可以实现排序,选择哪种方法依赖于底层Model。如果model是可排序的,即模型重新实现了QAbstractItemModel::sort()函数,QTableView与QTreeView都提供了API,允许以编程的方式对Model数据进行排序。此外,可以通过把QHeaderView::sortIndicatorChanged()信号与QTableView::sortByColumn()槽或QTreeView::sortByColumn()槽的分别进行连接,也可以进行互动式的排序(比如,允许用户单击表头来对数据进行排序)。

    如果模型没有所要求的接口,或想用列表视图Listview来显示数据,另一个方法是就在视图显示数据之前使用代理模型(PROXY MODEL)来转换模型的结构。

6、便利类

    为了使应用程序可以使用Qt基于项的视图和表格类,从标准的视图类中衍生出了一些项视图的便利类。他们的存在不是用于子类化,只是为了给Qt3中相应的类提供一个类似的接口。这些类包括QListWidget、QTreeWidget和QTableWidget,他们分别提供了Qt3中的QListBox、QListView、和QTable相似的行为。

    这些类没有视图类那么灵活,也不能用于任意模型。除非你强烈需要一套基于项的便利类,否则我们推荐你在处理项视图数据时使用模型/视图的方法。
    如果希望利用模型/视图方法所提供的特性,同时又想使用基于项的接口,那就考虑把QStandardItemModel类与视图类如QListView、QTableView和 QTreeView等搭配使用。

7、Models 和Views的使用

    Qt提供了两个标准的Models:QStandardItemModel和QFileSystemModel。    QStandardItemModel是一个多用途的Model,是一种可用于表示被list、table、tree等Views所需要的各种不同数据的数据结构。QStandardItemModel本身持有数据。QFileSystemModel维护目录内容的相关信息,本身不持有数据,只是对本地文件系统中的文件与目录的简单显示。QFileSystemModel是一个现成的Model,它很容易进行配置以用于现存的数据。使用QFileSystemModel可以很好地展示如何给一个现成的View设定Model,研究如何用Model indexes来操纵数据。

QListView与QTreeView很适合与QFileSystemModel搭配使用。下面的例子在树形视图与列表视图显示了相同的信息。两个视图共享用户选择,用户选中的项在两个视图中都会被高亮。


    先创建一个QFileSystemModel以供使用,再创建多个Views去显示目录的内容。Model的创建与使用都在main()函数中完成:

 

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

 {

    QApplication app(argc, argv);

    QSplitter *splitter = new QSplitter;

 

    QFileSystemModel *model = new QFileSystemModel;

    model->setRootPath(QDir::currentPath());

 

从某一文件系统设置Model去使用数据,调用setRootPath()告知模型文件系统上哪个驱动器呈现给Views,我们创建了两个Views,以便我们用两种不同的方式检查模型中的Items

     QTreeView *tree = new QTreeView(splitter);

     tree->setModel(model);

    tree->setRootIndex(model->index(QDir::currentPath()));

 

     QListView *list = new QListView(splitter);

     list->setModel(model);

     list->setRootIndex(model->index(QDir::currentPath()));

 

Views的构造方式与其他组件相同。 设置View以显示模型中的项仅仅是使用模型作为参数来调用其成员setModel()函数这样一个简单的问题。 我们通过在每个视图上调用setRootIndex()函数来过滤模型提供的数据,以当前文件目录的文件系统模型索引作为合适的模型索引传递

  在这种情况下使用index()对QFileSystemModel来说是唯一的,我们提供一个目录,它返回一个模型索引

  函数的剩余部分只是显示分离组件中的视图,并运行应用程序的事件循环

    splitter->setWindowTitle("Two views onto the same file systemmodel");

    splitter->show();

    return app.exec();

 }

 

    在上面的例子中,我们忽略了如何处理项的选择。 此主题在项视图中处理选择的部分中有更详细的说明。

二、Model类

1、Model简介

Model/View架构中,Model为View和Delegates使用数据提供了标准接口。

   在Model/View架构中,Model提供了一个标准接口,便于View和Delegates访问数据。 在Qt中,标准接口由QAbstractItemModel类定义。 无论数据项如何存储在任何基础数据结构中,QAbstractItemModel的所有子类都将数据表示为包含items表格的层次结构。 View使用此约定来访问Model中的数据项,但它们不会限制在向用户呈现此信息的方式中。


模型还通过信号和槽机制通知任何附加的关于数据变化的视图。

 

本节介绍一些基本概念,这些基本概念对于通过模型类访问其他组件的数据项方式至关重要。更高级的概念将在后面的章节中讨论。

2、模型索引

    为了确保数据显示与数据访问分离,引入了模型索引的概念。通过Model获取的数据项可以通过模型索引显示。Views和Delegates都使用索引来访问数据项,然后显示出来。因此,只有Model需要了解如何获取数据,并且Model管理的数据类型可以定义地非常广泛。模型索引包含一个指向创建它们的Model的指针,这样可以避免使用多个Model时引起混淆。
 QAbstractItemModel*model = index.model();

    模型索引提供对信息块的临时引用,通过它可以用来提取或修改Model中的数据。由于Model经常会重新组织内部的结构,使得模型索引失效,因此不应保存模型索引。如果需要一个对信息块的长期引用,必须创建一个永久的模型索引。这样会为不断更新的Model信息提供一个引用。临时模型索引由QModelIndex类提供,而永久模型索引则由QPersistentModelIndex类提供。

    为了获取相应数据项的模型索引,必须指定Model的三个属性:行数,列数,父项的模型索引。

3、行数和列数

    在Model最基本的形式中,Model可以使用简单的表格进行存取,表格中的项根据行号和列号确定。但这并不意味底层数据以数组结构储存,使用行号和列号只是组件之间相互通信的一个约定。我们可以提取任何指定行号和列号的Model项的信息,同时得到一个代表这个项的索引。

QModelIndex index = model->index(row, column, ...);

    Model为简单且单一层次数据结构如列表和表格提供接口的模型不需要提供任何其他的信息,但是,就像上面的例子所标明的一样,当要获得一个模型索引时我们要提供更多的信息。


    图表显示了一个基本的tableModel,表格的每一项用一对行列数来定位。通过行列数,可以获取代表一个数据项的模型索引。

QModelIndexindexA = model->index(0, 0,QModelIndex());
QModelIndex indexB = model->index(1, 1,QModelIndex());
QModelIndex indexC = model->index(2, 1,QModelIndex());

    Model的顶层项总是通过指定QModelIndex()函数来作为他们的父项引用。

4、父项

    当在一个表格或列表视图中使用数据时,Model提供的表格型数据接口是较为理想的。行列号系统正好映射到Views显示项的方式。然而,诸如树型视图的结构要求Model对其内部项要有更灵活的接口。因此,每一个项也可能是另外一个表的父项,同样地,树型视图的顶级项也可以包含另一个列表。
    当需要Model项一个索引时,我们必须提供一些关于这个项的父项的一些信息。在Model外,引用一个项的唯一方法就是通过模型索引,所以一个父项的模型索引也必须要提供。

QModelIndex index = model->index(row, column, parent);


    图表显示了一个树Model的表示法,树Model的项由父项,行和列号定位。项”A”和项”C”代表Model中的顶层成员。

 QModelIndex indexA =model->index(0, 0, QModelIndex());
 QModelIndex indexC =model->index(2, 1, QModelIndex());

    项“A”有一个子成员,项“B”的Model index可以用以下的代码获得:

QModelIndexindexB = model->index(1, 0, indexA);

5、数据项的角色

Model中的项可以为其他组件扮演不同的角色,允许为不同的情形提供各种不同的数据。例如,Qt::DisplayRole就是用于存取一个可以在视图中以文字显示的字符串。通常情况下,项包含各种不同的角色的数据,标准的角色由Qt::ItemDataRole定义。

通过传递对应项的模型索引给Model,并指定一个角色以取得我们想要的数据的类型,我们就可以从Model中取得项的数据:

QVariantvalue = model->data(index, role);


    角色为Model指明哪一种数据被引用。视图以不同的方式显示角色,所以为每一种角色提供合适的信息是很重要的。Qt::ItemDataRole里定义的标准角色涵盖了项数据最常用的用途。通过为每个角色提供合适的项数据,Model就可以为视图和委托提供关于怎样向用户显示项的提示。各种不同的视图都有根据需要中断或忽略这些信息的自由,同时也可以为特定的程序要求定义另外的角色。

6、总结

l  模型索引以一种独立于任何底层数据结构之外的方法,为视图和委托提供关于模型中项的定位信息。

l  项以他们的行号和列号,以及他们的父项的模型索引作为引用

l  模型索引应其他组件如视图和委托的要求由模型来构造。

l  当使用index()函数请求一个索引时,如果指定一个有效的模型索引作为父项索引,则返回的索引指向模型里这个父项下面的一个项。这个索引获得该项的子项的一个引用。

l  当使用index()函数请求一个索引时,如果指定一个无效的模型索引为父项索引,则返回的索引指向模型里的一个顶级项。

l  角色区分与项关联的不同种类的数据。

7、Model indexes使用

    为了演示如何使用模型索引从模型中获得数据,我们创建了一个没有视图的QFileSystemModel,把文件名和目录名显示在一个组件中。虽然这个例子并没有显示使用模型的常用方法,但是说明了使用模型索引时Model所使用的约定。我们用下面的方法构建一个文件系统模型:

     QFileSystemModel *model = new QFileSystemModel;
     QModelIndex parentIndex = model->index(QDir::currentPath());
     int numRows = model->rowCount(parentIndex);

    在这个例子中,我们创建了一个默认的QFileSystemModel,使用这个Model的index()函数提供的一个特定的实现获得一个父索引,同时使用rowCount()函数计算出这个模型的行数。
    为简单起见,我们只关注模型第一列的数据。我们按顺序逐行检查,获得每行第一个项的模型索引,然后读取存储在Model项里的数据。

     for (int row = 0; row < numRows; ++row) {
         QModelIndex index = model->index(row, 0, parentIndex);

    为了获得一个模型索引,我们指定行号,列号(第一列为0),以及我们想要的所有数据项的父项模型索引。储存于每个项中的文本可以用Model的data() 函数获得。我们指定一个模型索引以及DisplayRole来取得一个字符串形式的项数据。

         QString text = model->data(index, Qt::DisplayRole).toString();
         // Display the text in a widget.
 
     }

从模型中提取数据的一些基本原则:

l  Model的大小可以用rowCount() 和 columnCount()得到。这两个函数通常要指定一个父模型索引。

l  模型索引用于存取Model里的项。指定项必须要有行号,列号以及父模型索引。

l  要存取Model的顶级项,就用QModelIndex()函数指定一个空的模型索引作为父模型索引。

l  项包含不同角色的数据。要获得一个特定角色的数据,必须要为Model提供模型索引和角色。

可以通过实现QAbstractItemModel提供的标准接口来创建新模型。 在“创建新模型”部分中,我们通过创建一个方便的现成模型来保存字符串列表来演示这一点。

三、View类

1、View简介

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

内容与显式的分离是通过由QAbstractItemModel提供的标准模型接口,由QAsbstractItemview提供的标准视图接口和用来表示数据项的模型索引共同实现的。View负责管理从Model中读取的数据的外观布局。它们自己可以去渲染每个数据项,也可以利用Delegate来既处理渲染又进行编辑。
  除了显示数据,Views也处理数据项的导航,参与有关于数据项选择的部分功能。View也实现一些基本的用户接口特性,如上下文菜单与拖拽功能。View也为数据项提供了默认编程功能,也可搭配Delegate实现自定义的编辑器。

View创建时Model不是必须已存在,但在View能显示一些真正有用的信息之前必须提供一个Model。View通过使用选择来跟踪用户选择的数据项,这些数据项可以由单个View独立维护,也可以由多个View共享。

像QTableView和QTreeView这样的视图,除数据项之外也可显示标题(Headers),标题部分通过QHeaderView来实现。标题与View一样总是访问包含他们的同样的Model。通常使用QAbstractItemModel::headerData()函数从Model中获取数据,标题通常以表格的形式显示在标签中。为了为View提供更多特定的标签,新标题需要子类化QHeaderView。

2、View使用

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


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

3、单个Model使用

我们将我们创建的字符串列表Model作为示例模型,使用一些数据设置它,并构造一个View以显示模型的内容。这可以在单个功能内执行:

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

 {

    QApplication app(argc, argv);

 

 //Unindented for quoting purposes:

 QStringList numbers;

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

 

 QAbstractItemModel *model = newStringListModel(numbers);

注意,StringListModel被声明为QAbstractItemModel。 这允许我们使用Model的抽象接口,并确保代码仍然有效,即使我们用不同的Model替换字符串列表Model。

QListView提供的列表View足以显示字符串列表Model中的项。 我们构造View,并使用以下代码行设置

Model: QListView *view = new QListView;

 view->setModel(model);

View以正常方式显示:

    view->show();

    return app.exec();

 }

 

    视图呈现模型的内容,通过模型的界面访问数据。当用户试图编辑数据项时,View会使用默认Delegate来提供一个编辑组件。


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

4、单个模型对多个视图使用

    为多个Views提供相同的Model是非常简单的事情,只要为每个View设置相同的Model。以下代码创建了两个表格视图,每个视图使用同样的简单的表格模型。

QTableView *firstTableView= new QTableView;

QTableView *secondTableView= new QTableView;

 firstTableView->setModel(model);

 secondTableView->setModel(model);

    在Model/View架构中,信号-槽机制的使用意味着Model中发生的改变会传递到所有连接的View中,保证了不管我们使用哪个View,访问的都是同样的一份数据。


    上图展示了同一Model上的两个不同的Views,每个视图中包含一点数量的选中项。尽管在不同的View中显示的Model中的数据是一致的,每个View都维护它们自己的内部选择模型,但有时候在某些情况下,共享一个选择模型也是需要的。

5、处理数据项的选择

    多个View中数据项选择处理机制由QItemSelectionModel类提供。所有标准的View默认都构建自己的选择模型,以标准的方式与它们交互。视图使用的选择模型可以用selectionModel()函数获得,通过setSelectionModel()函数可以设置选择模型。当我们要在一个Model上提供多个一致的Views时,视图中对选择模型的控制能力是非常有用的。通常来讲,除非子类化一个Model或View,不必直接操作选择的内容。但是,如果需要,可以访问与选择模型的接口,这将在处理项视图中的选择中进行探讨。

6、多视图间共享选择

    虽然视图默认提供的选择模式很方便,当我们在同一Model使用多个视图时,在多个视图间方便地显示Model数据和用户选择是需要的。由于View允许自身内部的选择模式可以被设置,使用以下代码可以在多个视图间实现一样的选择:

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

    第二个视图设置了与第一个视图一样的选择模式。两个视图操作同样的选择模式,保持了数据与选中项的同步。


    以上例子显示,同样类型的两个视图显示了同一个模型的数据。然而,如果使用两个不同类型的视图,在每个视图显示的选中项将会不同。例如,在一个表格视图中持续选择可能会在数学视图中显示的是高亮。

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

模型视图(02):【纲】Model View Programming[官翻]

文章目录模型/视图编程简介模型/视图的体系结构模型视图代理排序方便类使用模型和视图Qt包括的两种模型利用现有模型使用视图模型基本概念模型索引 Model indexes行和列项目的父项项目的角色总结使用模型索引进一步的阅读视图概念使用现有视图使用一个模型多个视图使用一个模型处理被选择项目在视图之间共享被选择项代理类概念使用现有的代理一个简单的代理提供一个编辑器向模型提交数据更新编辑器的几何大小编辑提示处理项视图中的选定项概念当前项和选定项使用选择模型选定项读取选择状态更新一个选定选择模型中的所有项创建新模型

读书笔记 722

第十四章、Model/View开发:Model/View架构程序设计模式

一、简介 在PyQt和Qt中,Model/View架构是图形界面开发时用于管理数据和界面展现方式的关系。由该体系架构引入的功能分离使得开发人员能够更灵活地定制展现数据项的呈现方式,并提供标准模型接口支持广泛的数据源与预定义好的项视图(item views)一起使用。 二、Model/View架构概述 2.1、引言 模型-视图-控制器(Model-View-Controller,简称MVC)是一种源...

老猿Python 2646

Qt Model-View架构领悟

在Qt的Model-View架构的使用中,存在一些选择策略问题,本文参考一些大神的资料,结合个人认识,与诸位分享。

蚂蚁寻路 2549

Qt Model/View 学习笔记

Qt Model/View Qt 中的多线程 QT中的事件机制 试用QT中的多语言翻译

告别密码明文传输:手把手带你用Python实现SRP-6协议(附完整代码)

本文详细介绍了如何使用Python实现SRP-6协议,确保密码安全传输和存储。通过零知识证明与密钥交换技术,SRP协议在不传输明文密码的情况下完成认证,适用于金融App等高安全需求场景。文章包含完整代码示例和实战技巧,帮助开发者规避常见安全陷阱。

weixin_30689307的博客 412

05-1_Qt 5.9 C++开发指南_Model/View结构基础(基本原理;数据模型;试图组件;代理)

Model/View 结构的典型应用是在数据库应用程序中,例如数据库中的一个数据表可以在一个 OTableView 组件中显示和编辑。主要的视图组件有 QListView、QTreeView 和 QTableView,第 4 章介绍的 QListWidget、QTreeWidget 和 QTableWidget 分别是这 3 个类的便利类,它们不使用数据模型,而是将数据直接存储在组件的每个项里。

分享学习成长历程,Winter is coming! 1164

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4005

Model/View Programming

Model/View Programming引言Model/View架构 引言 Qt包含了许多项目视图类,它们通过Model/View框架来管理数据和数据以何种方式呈现到用户之间的关系。由Model/View架构引入的功能分离赋予了开发者更大的灵活性定制化项目描述,提供了一种标准化的数据模型接口,允许使用现有的项目视图展示大量的数据源。在本文档中,我们简要介绍了Model/View范例,勾勒涉及到...

zdx19880830的专栏 600

spoon工具的常用基础操作

先创建一个作业,这个作业流程,包括进行设置变量转换,查询结果输出转换,方便后续循环。整个流程写完后,执行作业5_执行整个流程,成功后,可以在数据库查看结果。,新建一个转换,excel表输入然后复制记录到结果,保存转换文件。这三个用户下 都有一张emp表 分别是 三个部门的用户信息。,新建一个数据库连接,变量命名用户名和密码。成功执行后,可以到保存的excel位置进行查看。emp表输入,可以进行预览查看数据有没有过来。输出到一直excel表,运行结果输出。,新建一个转换,拖拽。

qq_43583887的博客 5831

群晖NAS实战:Python项目部署全流程解析

本文详细解析了在群晖NAS上部署Python项目的完整流程。从开启SSH、选择连接工具,到通过套件中心一键安装Python3、配置pip及国内镜像源,再到上传项目、安装依赖、后台运行及排错,提供了清晰的避坑指南。旨在帮助用户将群晖NAS从存储设备转变为可执行自定义任务的智能服务器,实现自动化脚本、数据监控等应用。

weixin_29057163的博客 593

【课程设计】ssm基于JavaEE的电脑销售管理系统设计与实现毕业设计源码021143

用户:注册登录、首页、论坛、公告消息、电脑资讯、电脑推荐、我的账户、我的收藏、我的购物车、我的订单、个人中心 管理员:轮播图、公告栏、用户管理、论坛列表、论坛分类列表、电脑资讯分类、电脑商城、分类列表、订单列表、电脑推荐...

专业程序开发源的博客 2746

CSP-J第一道模拟题——贪心的小朋友

第一行是一个整数 n,表示糖果的堆数 第二行是由空格分隔的 n 个正整数,即数组 candies,表示每堆糖果的数量。后一个离场的小朋友所拿的糖果总堆数必须小于前一个小朋友(对第一个小朋友没有限制)后一个离场的小朋友所拿的糖果总量必须小于前一个小朋友(对第一个小朋友没有限制)这道题目很简单,但是必须删去无用的部分,看清题目,才能得分哦!输出一行共一个整数,表示最多可能有多少个小朋友吃上了美味的糖果。输出最多可能有多少个小朋友吃上了美味的糖果。离场之后的小朋友才能吃上美味的糖果。每个小朋友可以拿多堆糖果。

weixin_29959235的博客 639

QT 模型视图编程(Model/View Programming)

模型/视图编程简介 Qt包含一组项视图类,这些类使用模型/视图体系结构来管理数据之间的关系以及数据呈现给用户的方式。此体系结构引入的功能分离为开发人员提供了更大的灵活性来定制项的表示,并提供了一个标准的模型接口,允许广泛的数据源与现有的项视图一起使用。在本文中,我们简要介绍了模型/视图范式,概述了所涉及的概念,并描述了项目视图系统的体系结构。对体系结构中的每个组件都进行了说明,并给出了一些示例来说明如何使用所提供的类。 模型/视图体系结构 模型视图控制器(MVC)是一种源于Smalltalk的设计模式,在构

Allen Roson 1122

HBuilderX结合Android Studio实现Uniapp安卓Apk高效离线打包指南

本文提供了一份详细的Uniapp安卓Apk离线打包实战指南。通过整合HBuilderX与Android Studio,手把手教你搭建本地编译环境、配置原生工程、执行核心打包流程,并分享快速更新资源和排查常见问题的技巧,助你彻底摆脱云端打包的排队依赖,实现高效、可控的应用构建。

weixin_28835551的博客 558

华为OD机试 - 素数之积 - 数学问题(Java 2025 A卷 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 2133

小程序中View与Model的交互机制详解

🤍 前端开发工程师、技术日更博主、已过CET6🍨、23年度博客之星前端领域TOP1🕠高级专题作者、打造专栏🍚签约作者、上架课程💬 前些天发现了一个巨牛的,通俗易懂,风趣幽默,忍不住分享一下给大家。。

你若盛开,清风自来 1115

Qt/C++ 音视频开发: 共享解码线程/重复利用解码/极低CPU占用/画面同步/进度同步

通过共享解码线程和重复利用解码技术,可以显著降低CPU占用,提高多媒体应用的性能。同时,画面和进度同步技术保证了视频播放过程的平滑体验。

走向CTO的路上... 988

c++ qt获取电脑的内存_QT开发(三十六)——Model/View框架

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

weixin_39734074的博客 782

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

QT模型视图MVC系列教程(4)---角色role的使用(Qt::DisplayRole 类型)

模型正在维护的数据,不仅是视图中所看到的那些,还有很多数据在视图是被隐藏的,你看不到,不代表他没有,比如,一个列表视图中,不仅会显示文字,文字前可能还会显示一个图标。 其实,每一个条目,所包含的内容,不仅有文字、图标,还有很多,到底有哪些呢,看一下枚举Qt::DisplayRole 就知道了,在QT5.10中,有22个,以后随着QT版本更新,这个值可能会变化。 当视图View向模型Model索要数据时,不仅要提供索引 index,还必须要提供角色role。index和role共同决定出视图到底在向Mod

野生猿-群号1025127672 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Model/View——(一)简介和基本概念

《Qt 5.9 C++开发指南》

qq_43634706的博客 1536

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Modle/View结构

model/view

x13262608581的博客 830

Qt模型视图框架介绍

默认情况下,所有标准视图都会构建自己的选择模型。费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击。费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击。

hw5230的博客 912

17、Model、View的基本理解

Model/View(模型/视图)结构是Qt中用界面组件显示与编辑数据的一种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据之间的接口。Model/View结构的典型应用是在数据库应用程序中,例如数据库中的一个数据表可以在一个QTableView组件中显示和编辑。 将界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是处理界面与数据的一种较好的方式。 模型、视图和代理之间使用信号与槽通信。当源数据发生变化时,数据模型发射信号通知视图组件;当用户在

伍粟的博客 2750

PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及含义

在PyQt中,模型可以针对不同的组件(或者组件的不同部分,比如按钮的提示以及显示的文本等)提供不同的数据。例如,Qt.DisplayRole用于视图的文本显示。通常来说,模型中的数据项包含一系列不同的数据角色,数据角色定义在 Qt.ItemDataRole 枚举中,包括下列枚举值: Qt.DisplayRole:文本表格中要渲染的关键数据 Qt.EditRole:编辑器中正在编辑的数据 Qt.To...

老猿Python 7405
上一篇: (三十四)自定义菜单
下一篇: (三十六)Model/View Programming (二)
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值