在上一章学习 25.QT-模型视图 后,本章接着学习视图委托 ---- 视图委托(Delegate)简介 由于模型负责组织数据,而视图负责显示数据,所以当用户想修改显示的数据时,就要通过视图中的委托来完成...QWidget * createEditor( QWidget * parent, QStyleOptionViewItem & option, QModelIndex & index ) ; //创建编辑器...// hint 参数用来指定当用户完成编辑后,应该显示什么标记,用来提示用户已完成编辑 void commitData ( QWidget * editor ) ; //当完成编辑数据后,发送该信号...; void setModelData( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index...成员函数 在editorEvent中处理交互事件,比如判断鼠标是否双击,以及更改模型数据等 其中QApplication::style()->drawControl()函数参数如下所示: QApplication
QAbstractItemModel:需要使用QTreeView显示数据时,并配合自定义model时,我们从此类继承。...void setPtr(void* p) { _ptr = p; } void* ptr() const { return _ptr; } 由于建立TreeItem对象树时,Province和Person...地址会被setPtr()保存到TreeItem上,所以为了便于按类型取数据,在setPtr()时需要setType()保存数据属于哪种类型。...override; 在parent节点下,第row行,第column列位置上创建索引;将TreeItem指针保存至该索引。...parent(const QModelIndex &index) const override; 创建index的父索引,若父节点为根节点,则返回QModelIndex(),默认根节点索引为空。
在 model/view 架构中,model 提供一种标准接口,供视图和委托访问数据。在 Qt 中,这个接口由QAbstractItemModel类进行定义。...由于模型随时可能重新组织其内部的结构,因此模型索引很可能变成不可用的,此时,就不应该保存这些数据。如果你需要长期有效的数据片段,必须创建持久索引。持久索引保证其引用的数据及时更新。...此时,我们获得的是一个索引对象(回忆一下,通过索引我们可以获取具体信息): 1 QModelIndex index = model->index(row, column, ...); 模型提供了一个简单的接口...那么,我们就应该使用下面的代码获取 B 的索引: 1 QModelIndex indexB = model->index(1, 0, indexA); 由此我们看到,如果只有行号和列号两个参数,B 的行号是...(视图和委托)请求时才会被创建; 如果使用index()函数请求获得一个父项的可用索引,该索引会指向模型中这个父项下面的数据项。
在Qt中,通常我们不会在TableView等组件中保存数据,一般会将这些数据存储至数据库或者是文件中保存,当使用时则动态的在数据库中调出来,以下案例将实现,当用户点击并选中TableView组件内的某一行时...以下是 QItemSelectionModel 的一些常用方法,概述成表格形式: 方法 描述 QItemSelectionModel(QAbstractItemModel *model) 构造函数,创建一个选择模型并关联指定的数据模型...select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) 根据给定的 QModelIndex 对象和选择标志执行选择操作...以下是 QDataWidgetMapper 的一些主要方法,概述成表格形式: 方法 描述 QDataWidgetMapper(QObject *parent = nullptr) 构造函数,创建一个数据映射器对象...QDataWidgetMapper 创建 QDataWidgetMapper 对象 dataMapper,设置提交策略为自动提交。
MVC(Model-View-Controller)包括了3个组件:模型(model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;控制(Controller)定义了用户界面对用户输入的反应方式...当标准模型还无法满足需要时,可子类化QAbstractItemModel、QAbstractListModel或QAbstractTableModel来创建自定义的模型。...模型索引包含一个指针,指向创建他们的模型,使用多个模型时可避免混淆。...QListView将数据项显示为一个列表;QTableView将模型中的数据显示在一个表格中;QTreeView将模型中的数据项显示在具有层次的列表中。...QTableView和QTreeView在显示项目的时候同时还可以显示标头,通过QHeaderView类实现。
一直想学习Qt Model/View,最终还是看的官方教程,现在将官方教程重新在梳理下。 每个UI开发人员都应该了解Model/View编程!可见Model/View在UI编程中的重要性!...由于视图类不知道数据的结构,因此需要提供包装器以使数据符合QAbstractItemModel接口【译者注:这就是为什么要setMode】。...View使用该接口进行读取和写入数据,实现QAbstractItemModel的类的任何实例都称为模型【译者注:什么是Model】。...我们创建MyModel的实例并使用tableView.setModel(&myModel), 将其指针传递给tableView ,tableView将调用它收到的指针获得以下信息: 应显示多少行和多少列...所以我比较喜欢知道为什么这么做、这么做应该会有一个什么样的结果。
在QTableView的一列里添加两个按钮,之前添加一个按钮的思路是一样的,只是计算了一下按钮的宽,放两个按钮而已。...点击第二个按钮弹出but2 + 当前行 下面是主要实现 继承自 QItemDelegate 主要是实现 了它的painter方法,把两个自定义的按钮绘制到视图并保存 还有editorEvent事件,用来处理点击事件,在点击时我们算一下鼠标的坐标在哪个按钮下...&index) const; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem...QStyle::CE_PushButton, buttons->second, painter); } bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel...index.isValid()) return Qt::NoItemFlags; Qt::ItemFlags flag = QAbstractItemModel::flags(
在自定义代理中QAbstractItemDelegate是所有代理类的抽象基类,我们继承任何组件时都必须要包括如下4个函数:CreateEditor() 用于创建编辑模型数据的组件,例如(QSpinBox...&index) const{//创建代理编辑组件 Q_UNUSED(option); Q_UNUSED(index); QSpinBox *editor = new QSpinBox...(parent); //创建一个QSpinBox editor->setFrame(false); //设置为无边框 editor->setMinimum(0); editor->setMaximum...强制类型转换 spinBox->setValue(value); //设置编辑器的数值}void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel...>(editor); comboBox->setCurrentText(str);}void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel
db.open()打开数据库连接 db.close();//释放数据库 QStringList drivers = QSqlDatabase::drivers();//静态成员函数,是类的成员函数,不是对象的...使QSqlQueryModel类 创建的数据库能读写,继承QAbstractItemModel类 刚开始我们就讲到,这个模型默认是只读的,所以我们在窗口上并不能对表格中的内容进行修改。...bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::...EditRole ) //设置根据index索引到的value值 Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ...) const //返回给定的index索引的标志 QVariant QAbstractItemModel::data ( const QModelIndex & index, int role =
在自定义代理中QAbstractItemDelegate是所有代理类的抽象基类,我们继承任何组件时都必须要包括如下4个函数: CreateEditor() 用于创建编辑模型数据的组件,例如(QSpinBox...&index) const { //创建代理编辑组件 Q_UNUSED(option); Q_UNUSED(index); QSpinBox *editor = new QSpinBox...(parent); //创建一个QSpinBox editor->setFrame(false); //设置为无边框 editor->setMinimum(0); editor-...强制类型转换 spinBox->setValue(value); //设置编辑器的数值 } void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel...value); } // https://www.cnblogs.com/lyshark void QWFloatSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStyledItemDelegate...在Qt中,QStyledItemDelegate 类是用于创建自定义表格视图(如QTableView和QTableWidget)的委托类,允许你自定义表格中每个单元格的外观和交互。...在自定义代理中QAbstractItemDelegate是所有代理类的抽象基类,它用于创建自定义的项委托。提供了一个基本的框架,使得可以定制如何在视图中绘制和编辑数据项。...我们继承任何组件时都必须要包括如下4个函数:CreateEditor() 用于创建编辑模型数据的组件,例如(QSpinBox组件)SetEditorData() 从数据模型获取数据,以供Widget组件进行编辑...,用于控制数据项在视图中的外观和交互行为。
模型视图设计模式的核心思想 使模型(数据)与视图(显示)相分离 模型只需要对外提供标准接口存取数据,无需数据如何显示 视图只需要自定义数据的显示方式,无需数据如何组织存储 当数据发生改变时,会通过信号通知视图...当用户与视图进行交互时,会通过信号向模型发送交互信息 在QT中提供了以下几种预定义模型: ?...QAbstractListModel:用来创建一维列表模型 QStandardItemModel:用来存储定制数据的通用模型 QAbstractTableModel: 用来创建二维列表模型 常用的视图类层次结构...其中index()是个重载函数,用来获取QModelIndex 索引值,完整的index()函数如下所示: QModelIndex QAbstractItemModel::index ( int row.../通过索引值获取文件路径 bool isDir ( const QModelIndex & index ) ; //通过索引值,判断是否是目录 int columnCount (
其中学生信息原始数据只有姓名、三门课成绩,需显示的列多一些,包含: 班级/姓名、语文、数学、外语、总分、平均分、是否合格、是否评优 其中后面几列是根据学生成绩计算得出的: 所有课成绩都>60则合格,...我们写一个自定义的TreeModel,继承自该类,实现里面的一些重载函数: #include "TreeItem.h" #include #include <QModelIndex...QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const override;...QModelIndex parent(const QModelIndex &index) const override; int rowCount(const QModelIndex &...比如我们只存储了基本的3门课程分数,其他内容全为显示时视图向我们的自定义model获取数据时实时计算得出的! 可能你会担心,这样计算量会不会变大,导致反应速度变慢?
:ItemIsEditable(可编辑属性) //然后当我们双击时,会默认创建一个编辑组件(这是由 delegate 完成的)然后delegate会调用QAbstractTableModel ::data...EditRole)读取默认编辑值 //当我们编辑完成后, delegate会调用QAbstractTableModel :: setData (index, value, Qt::EditRole)告诉我们是否保存数据...如果对于可调整行列的模型,可以重写insertRows()、removeRows()、insertColumns()、removeColumns().在实现这些函数时,还需要调用合适的父类函数,用来通知...::SortOrder order = Qt::AscendingOrder); //当用户点击标题进行降序/升序排序时,会调用该方法 //或者调用QtableView->sortByColumn()时,...{ return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; //设置item可编辑 } void CustomModel
如果把之前的QTableView改成QTreeView,我们在不改变Model的情况下可以直接得到一个没有结构层次的“树”;因为QAbstractTableModel不具有数据层次结构,如果我们想要实现有层次的数据结构...下面梳理下几个类的关系: QObject || QAbstractItemModel || QAbstractTableModel(Table层次结构) QStandardItemModel...(Tree层次结构) 如果以后构建自己的代码库时,各个模块划分的越详细则越方便复用。...,在槽函数中我们可以通过index获得所选Item的内容;通过顶层节点没有parent的特点来计算所选Item的层级。...= QModelIndex()) { seekRoot = seekRoot.parent(); hierarchyLevel++; } QString
首先要做的当然是新建一个model对象,可以使用成员变量或者局部变量。...成员变量好处是,使用这个model时不用调用函数和进行类型转换,但如果在model销毁时没有对成员变量进行操作就可能发生不可预料的错误。...A销毁时,模型1也会被一起同归于尽,而这时控件B就会发生不可预料的错误了。...子项目的添加需要操作 QStandardItem ,既是上面代码创建的 itemProject变量。...最常用的兄弟节点获取是“左右”节点,例如点击“频道1”要知道频道1的信息,就需要获取“频道1”右边的兄弟节点“频道1信息说明” QModelIndex QAbstractItemModel::sibling
QStandardItemModel 是 Qt 中用于存储标准项数据的模型类之一,它继承自 QAbstractItemModel 类。...bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) 在指定父项下插入行。...以下是代码片段的一些说明: 创建 QStandardItemModel 对象,并设置列数为 3。 为表头设置标签,分别是 "账号"、"用户"、"年龄"。 将模型设置为 QTableView。...这样,就创建了一个包含表头和数据的 QTableView,并将其显示在 MainWindow 中。...对于每行的最后一列,该列是可检查的,需要创建 QStandardItem,并设置为可检查状态。根据数据判断是否选中,并设置相应的检查状态。 将 QStandardItem 设置到模型的相应行列位置。
♣题目部分Oracle中,在编译存储过程、函数等对象时无响应该怎么办? ♣答案部分 在编译某个存储过程的时候,Oracle会自动给这个对象加上DDL锁,同时也会对这个存储过程所引用的对象加锁。
QFileSystemModel 对象。...bool mkdir(const QModelIndex &index, const QString &name) 在给定索引处的目录中创建新目录。...void directoryLoaded(const QString &path) 在目录加载完成时发射的信号。...void fileRenamed(const QString &path, const QString &oldName, const QString &newName)在文件重命名时发射的信号。...// 被点击后触发void MainWindow::on_treeView_clicked(const QModelIndex &index){ // 是否是目录 ui->chkIsDir-
本章我们继续实现表格的联动效果,当读者点击TableView或TreeView中的某一行时,我们让其实现自动跟随功能,且当用户修改行中特定数据时也让其动态的跟随改变,首先绘制一个主界面如图,分别放置两个组件框...*model, QObject *parent = nullptr)构造函数,创建一个与指定模型关联的 QItemSelectionModel 对象。...void select(const QModelIndex &topLeft, const QModelIndex &bottomRight, QItemSelectionModel::SelectionFlags...在MainWindow构造函数中,我们以此执行如下关键部分,来实现对主界面的初始化工作;创建模型和选择模型首先创建一个包含4行5列的 QStandardItemModel 模型,并为其创建了一个 QItemSelectionModel...QStandardItem 对象并将其添加到模型的相应位置。
领取专属 10元无门槛券
手把手带您无忧上云