派生QAbstractProxyModel小例

2024-05-03 04:38

本文主要是介绍派生QAbstractProxyModel小例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

派生QAbstractProxyModel小例

対源模型的代理本质上就是建立代理模型的索引与源模型的索引之间的映射关系。
定义QAbstractProxyModel的派生类时,需要完成两项任务:
1)、重载纯虚函数 mapToSource()和 mapFromSource(),定义代理模型索引与源模型索引之间的映射关系。
2)、实现QAbstractItemModel的最小接口。因为QAbstractProxyModel是QAbstractItemModel的子类,
从前者派生出的代理模型必须实现所有模型都应该实现的最小接口:
    index(),parent(),rowCount(),columnCount(),data()

/********************************************************************************************/

//widget.h 	

#ifndef WIDGET_H
#define WIDGET_H
#include <QAbstractProxyModel>
#include <QVector>
class RevertProxyModel : public QAbstractProxyModel
{
    Q_OBJECT
public:
    RevertProxyModel(QObject *parent = 0);
    QModelIndex mapToSource(const QModelIndex &proxy_index) const;
    QModelIndex mapFromSource(const QModelIndex &source_index) const;
    QModelIndex index(int row,int column,const QModelIndex &proxy_index) const;
    QModelIndex parent(const QModelIndex & proxy_child) const;
    int rowCount(const QModelIndex &proxy_parent) const;
    int columnCount(const QModelIndex &proxy_parent) const;
private:
    int register_index(const QModelIndex &source_index) const;
    mutable QVector<QModelIndex> vector; //为使5个重载的常量函数能够修改vector,必须mutable
};
//在此没有重载data()函数,因为QAbstractProxyModel已经实现了该函数
/**
    QVariant QAbstractProxyModel::data(const QModelIndex &proxyIndex,
                                       int role) const{
        Q_D(const QAbstractProxyModel);
        return d->model->data(mapToSource(proxyIndex), role);
    }
**/
#endif // WIDGET_H

//widget.cpp

#include "widget.h"
#include <QFile>
#include <QTextStream>
#include <QModelIndex>
#define DEBUG
#ifdef DEBUG
static QFile file("log.text");
static QTextStream stream(&file);
#endif
RevertProxyModel::RevertProxyModel(QObject *parent)
    : QAbstractProxyModel(parent)
{
    vector.clear();
#ifdef DEBUG

这篇关于派生QAbstractProxyModel小例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955845

相关文章

泛型第二课,派生子类、属性类型、方法重写、泛型擦除

子类(实现类) 子类与父类|接口一样使用泛型子类指定具体的类型子类与父类|接口 同时擦除类型子类泛型,父类|接口 擦除错误:不能子类擦除,父类|接口泛型 package com.pkushutong.genericity3;/*** 父类为泛型类* 1、属性* 2、方法* * 要么同时擦除,要么子类大于等于父类的类型* 不能子类擦除,父类泛型* 1、属性类型* 父类中,随父类型定

Linux操作系统学习笔记(六)进程、线程的创建和派生

一. 前言   在前文中,我们分析了内核中进程和线程的统一结构体task_struct,本文将继续分析进程、线程的创建和派生的过程。首先介绍如何将一个程序编辑为执行文件最后成为进程执行,然后会介绍线程的执行,最后会分析如何通过已有的进程、线程实现多进程、多线程。因为进程和线程有诸多相似之处,也有一些不同之处,因此本文会对比进程和线程来加深理解和记忆。 二. 进程的创建   以C语言为例,我们

C++(继承与派生,虚基类,作用域标识符)

类的继承与派生: 继承关系与派生类:      类的继承,是新的类从以后类那里继承已有的特性,从已有类产生新类的过程就是类的派生,新类产生后,就具备了已有类的特征,原有的类叫做基类,产生的新类叫做派生类。 语法形式: class派生类名:继承方式―基类名1,继承方式―基类名2,…,继承方式―基类名n(派生类成员声明;};    一个派生类,可以同时有多个基类,这种情况成为多继承,同理,

另一种关于类的小例

前言 我们还是以一段关于构造函数的代码作为开端,我们以之前银行家的小项目为背景 class Account {constructor(owner, currency, pin) {this.owner = owner;this.currency = currency;this.pin = pin;}}const ITshare = new Account('ITshare', 'EUR',

问题解决:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

文章目录 问题场景问题环境问题原因解决方案结果总结随缘求赞 问题场景 因为项目需要,需要在公共框架里面引入sqlserver方言类。而在实现sqlserver方言类之后,调用方言类的方法的时候,发现一个错误 错误提示如下: >[错误] 脚本行:1-10 --------------------------------------Id 1033, Level 15, State

C++语言学习(八)—— 继承、派生与多态(二)

目录 一、多继承 1.1 多继承中的二义性问题 1.2 虚基类 二、多态 2.1 静态绑定与静态多态 2.2 动态绑定与动态多态 三、运算符重载 3.1 重载++、- -运算符 3.2 重载赋值运算符 3.3 重载输出流<<、输入流>>运算符 3.3.1 重载输出流(<<)运算符 3.3.2 重载输入流(>>)运算符 四、赋值兼容规则 五、虚函数 5.1 虚函数的定义

QT下显示自己派生的QWidget界面(提升为)

在实际开发过程中,我们可能有这样的需求,自己绘制一个仪表盘界面,然后将其贴到主界面上方。 这个时候就会用到“提升为”这个功能,该功能目的是将QWidget提升为自己派生的QWdiget子类,具体操作为,在主界面上拖入一个Widget,然后右键选择提升为,接在在提升的类名处,填入子类名称,依次选择添加-->提升即可,运行代码,即可显示自己派生的子类。

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

quick-cocos2dx 如何派生一个新类

quick lua 提供了一个函数class来生产新的派生类。该函数定义域function.lua中。class有两个参数,第一个为类名,第二个为基类。 下面是class的源码: function class(classname, super)local superType = type(super)local clsif superType ~= "function" and superTy

10_3、C++继承与派生:派生类成员访问

派生类成员访问 作用域分辨符虚基类概念及用法虚基类派生类的构造函数 赋值兼容规则 作用域分辨符 如果派生类中存在和基类中完全相同的函数,将发生同名覆盖。如果在派生类中存在一个和基类某数据成员同名的数据成员,或者和基类某成员函数的名称和参数表都相同的成员函数,则派生类中的新成员就覆盖了基类成员,不管是在派生类内还是在派生类外部只能通过成员名访问到派生类的成员,而访问不到基类成员。