自定义代理

news2025/3/12 13:20:38

 

 以下代码:可以在view 和model文章中进行添加


    m_model = new QStandardItemModel(2, FixedColumnCount, this);

    m_selection = new QItemSelectionModel(m_model, this);
    ui->tableView->setModel(m_model); //设置模型
    ui->tableView->setSelectionModel(m_selection); //设置选择的模型
    ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置选择的方式
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems); //设置选择行为
    connect(m_selection, &QItemSelectionModel::currentChanged, this, &MainWindow::do_currentChanged);

    intSpinDelegate = new TSpinBoxDelegate(this);
    ui->tableView->setItemDelegateForColumn(0, intSpinDelegate); //给第几列设置属性
    floatSpinDelegate = new TFloatSpinboxDelegate(this);
    ui->tableView->setItemDelegateForColumn(1, floatSpinDelegate);

    comDelegate = new TComBoxDelegate(this);
    QStringList strlist;
    strlist << "优"
            << "良"
            << "中"
            << "差";
    comDelegate->setItems(strlist, false); // com添加item并且不可以编辑
    ui->tableView->setItemDelegateForColumn(2, comDelegate);

tcomboxdelegate.cpp

#include "tcomboxdelegate.h"
#include <QComboBox>
TComBoxDelegate::TComBoxDelegate(QObject* parent)
    : QStyledItemDelegate { parent }
{
}
QWidget* TComBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    QComboBox* editor = new QComboBox(parent);
    editor->setEditable(m_editable);
    qDebug() << m_itemList.size();
    for (auto item : m_itemList) {
        editor->addItem(item);
    }
    return editor;
}

void TComBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    QComboBox* box = dynamic_cast<QComboBox*>(editor); //把editor转为指向QSpinBox的指针 动态强转
    QString value = index.model()->data(index, Qt::DisplayRole).toString();
    box->setCurrentText(value);
}

void TComBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
    QComboBox* box = dynamic_cast<QComboBox*>(editor); //把editor转为指向QSpinBox的指针 动态强转
    QString value = box->currentText();
    model->setData(index, value);
}

void TComBoxDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    editor->setGeometry(option.rect);
}

void TComBoxDelegate::setItems(QStringList list, bool editabale)
{
    m_itemList = list;
    m_editable = editabale;
}

tcomboxdelegate.h

#ifndef TCOMBOXDELEGATE_H
#define TCOMBOXDELEGATE_H

#include <QObject>
#include <QStyledItemDelegate>

class TComBoxDelegate : public QStyledItemDelegate {
    Q_OBJECT
public:
    explicit TComBoxDelegate(QObject* parent = nullptr);

    // QAbstractItemDelegate interface
public:
    virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    virtual void setEditorData(QWidget* editor, const QModelIndex& index) const override;
    virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override;
    virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    void setItems(QStringList list, bool editabale);

private:
    QStringList m_itemList;
    bool m_editable;
};

#endif // TCOMBOXDELEGATE_H

tfloatspinboxdelegate.cpp

#include "tfloatspinboxdelegate.h"
#include <QDoubleSpinBox>
TFloatSpinboxDelegate::TFloatSpinboxDelegate(QObject* parent)
    : QStyledItemDelegate { parent }
{
}
QWidget* TFloatSpinboxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    //创建
    QDoubleSpinBox* editor = new QDoubleSpinBox(parent);
    editor->setFrame(true);
    editor->setMinimum(0);

    editor->setMaximum(150);
    return editor;
}

void TFloatSpinboxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{ //设置值
    QDoubleSpinBox* box = dynamic_cast<QDoubleSpinBox*>(editor); //把editor转为指向QSpinBox的指针 动态强转
    double value = index.model()->data(index, Qt::DisplayRole).toDouble();
    box->setValue(value);
}

void TFloatSpinboxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{ //将值设置给模型
    QDoubleSpinBox* box = static_cast<QDoubleSpinBox*>(editor); //静态强转
    double value = box->value();
    model->setData(index, value);
}

void TFloatSpinboxDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    editor->setGeometry(option.rect);
}

tfloatspinboxdelegate.h

#ifndef TFLOATSPINBOXDELEGATE_H
#define TFLOATSPINBOXDELEGATE_H

#include <QObject>
#include <QStyledItemDelegate>

class TFloatSpinboxDelegate : public QStyledItemDelegate {
    Q_OBJECT
public:
    explicit TFloatSpinboxDelegate(QObject* parent = nullptr);

    // QAbstractItemDelegate interface
public:
    virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    virtual void setEditorData(QWidget* editor, const QModelIndex& index) const override;
    virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override;
    virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};

#endif // TFLOATSPINBOXDELEGATE_H

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一堂棒球课:MLB棒球大联盟的主要战术·棒球1号位

MLB棒球大联盟的主要战术 攻击战术run-and-foul&#xff08;跑垒战术&#xff09;&#xff1a;以速度为优势&#xff0c;在适当的时机发动进攻&#xff0c;争取在一回合内完成得分。 grounder&#xff08;阻截战术&#xff09;&#xff1a;队员在垒包之间阻止对手的跑垒和传球。…

eclipse 最新版没有navigator视图如何解决

使用project exploere视图可以显示类似navigator视图 1.显示project exploere视图 window---->show view --->project exploere 2.project exploere视图转换为类似navigator视图 第一步&#xff1a;点击视图右上角三个点或者倒三角&#xff0c;点击fiters and custom…

【java入门学习】

文章目录 java学习章节目录学习前的准备main函数怎么写&#xff1f;Java程序运行的步骤如何让代码运行起来&#xff1f;java程序由三部分构成&#xff1a;注释注释规范 标识符练习 总结 java学习章节目录 SE语法 初阶段主要来熟悉java的语法&#xff1a; 1.初始java 2.数据类型…

真正实现无人化自主管理的清洁机器人来了!涂鸦智能新方案为你解密

如果你观察家庭清洁电器的发展历程&#xff0c;可以发现这就是一部人类“偷懒”史&#xff0c;而有技术含量的“懒”&#xff0c;真的可以改变世界&#xff01; 一、懒是产品创新的重要灵感来源 从洗衣机替代手洗&#xff0c;到扫地机器人帮助人们从繁琐的地面清洁中解脱&…

RL 实践(6)—— CartPole【REINFORCE with baseline A2C】

本文介绍 REINFORCE with baseline 和 A2C 这两个带 baseline 的策略梯度方法&#xff0c;并在 CartPole-V0 上验证它们和无 baseline 的原始方法 REINFORCE & Actor-Critic 的优势参考&#xff1a;《动手学强化学习》完整代码下载&#xff1a;7_[Gym] CartPole-V0 (REINFO…

复现YOLOv8改进最新MPDIoU:有效和准确的边界盒回归的损失,打败G/E/CIoU,效果明显!!!

MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression 论文简介MPDIoU核心设计思路论文方法实验部分加入YOLOv5代码论文地址:https://arxiv.org/pdf/2307.07662.pdf 论文简介 边界盒回归(Bounding box regression, BBR)广泛应用于目标检测和实例分割,是目标…

详细介绍如何使用HuggingFace和PyTorch进行医学图像分割-附源码

医学图像分割是一种创新过程,使外科医生能够拥有虚拟的“X 射线视觉”。它是医疗保健领域非常有价值的工具,可提供非侵入性诊断和深入分析。考虑到这一点,在这篇文章中,我们将探索威斯康辛大学麦迪逊分校胃肠道图像分割Kaggle 挑战数据集。作为该项目的一部分,我们将使用 …

python核心-面向对象-三大特性-综合案例

# 定义三个类, 小狗, 小猫, 人 # 小狗: 姓名, 年龄(默认1岁); 吃饭, 玩, 睡觉, 看家(格式: 名字是xx, 年龄xx岁的小狗在xx) # 小猫: 姓名, 年龄(默认1岁); 吃饭, 玩, 睡觉, 捉老鼠(格式: 名字是xx, 年龄xx岁的小猫在xx) # 人: 姓名, 年龄(默认1岁), 宠物; 吃饭…

【替换】批量替换命令文件名称或者文件内容

你是否困扰过&#xff0c;每次文件F2进行修改&#xff0c;十几个没关系&#xff0c;百来个写代码麻烦&#xff0c;那就使用shell命令吧 执行语句 先养成习惯查询验证&#xff0c;因为是批量替换&#xff0c;为了防止全局替换嘎嘎叫 替换文件名 # 【习惯】先使用顾虑查询&…

暴力猴插件简明开发教程->百度首页默认设置为我的关注

文章目录 暴力猴插件开发简明教程->百度首页默认设置为我的关注缘起缘灭思路实现尾声 暴力猴插件开发简明教程->百度首页默认设置为我的关注 缘起 在我的百度首页有很多自己设置的导航链接(接近100个),里面放了我常用的网站, 如下图 但是最近一段时间, 我发现百度做了一…

算法38:反转链表

一、需求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例3&#xff…

电器水族设备加热器UL1018检测报告

UL1018---电气水族设备 适用范围&#xff1a;本标准要求适用于300V或以下&#xff0c;用于室内商业或家用的水族器材上的设备。如加热器、水泵、过滤器、反射器 电线支架等相似用途的产品。 本标准不包括: 不是和水族器材一起用的照明器或台子;水族容器 一、UL1018标准测试内…

R中无法安装GitHub包 | 花费大量时间的小小经验

写在前面 最近在安装R包时&#xff0c;遇到无法安装包的情况&#xff0c;然后自己就各种捣鼓。最后&#xff0c;R环境也会让自己弄崩&#xff0c;如果你遇到此情况R语言无法调用stats.dll的问题解决方案,可以参考我前面的方法捣鼓一下。 那么&#xff0c;这个推文也是记录自己…

【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

文章目录 前言官方解释内存布局程序运行中的内存布局通用方法 前言 在 Go 中&#xff0c;如果 interface{} 作为函数参数的话&#xff0c;是可以传任意参数的&#xff0c;然后通过类型断言来转换。 举个例子&#xff1a; package mainimport "fmt"func foo(v inter…

2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索

会议简介 Brief Introduction 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) 会议时间&#xff1a;2023年9月22日-24日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;ECNLPIR 2023-2023 Eurasian Conference on Natural Language Processing and Information Retr…

【GO】go语言入门实战 —— 命令行在线词典

文章目录 程序介绍抓包代码生成生成request body解析respond body完整代码 字节青训营基础班学习记录。 程序介绍 在运行程序的时候以命令行的形式输入要查询的单词&#xff0c;然后程序返回单词的音标、释义等信息。 示例如下&#xff1a; 抓包 我们选择与网站https://fany…

【Linux命令200例】用ln创建链接文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

Leangoo领歌敏捷看板工具,什么是敏捷看板?

敏捷看板 看板是一个团队共享的工作区&#xff0c;在看板上团队可以进行实时的工作任务协同&#xff0c;团队的工作以卡片的形式体现。通过泳道和任务列表组织管理。需求、任务、问题、缺陷 都作为卡片放在看板上&#xff0c;通过看板实现可视化和透明化的 管理&#xff0c;通…

mybatisx插件使用

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.java1234.mapper.SysUserMap…