qt的model view 使用示范

在这里插入图片描述

首先在ui界面拖一个tableView
ui->tableView->setModel(mission_model);

然后设置model的qss,并用view绑定model

void SettingWidget::init_missionmodel(QString plane_type, QString mission_name)
{if(mission_model)delete mission_model;mission_model = new MissionModel(plane_type, mission_name, this);connect(mission_model, SIGNAL(missionFollow_send(QVariant, QVariant)), this, SLOT(getMissionFollow(QVariant, QVariant)));connect(mission_model, SIGNAL(namePlate_show(QVariant)), this, SLOT(getNamePlate(QVariant)));ui->tableView->setModel(mission_model);int row_count = mission_model->rowCount();for (int i = 0; i < row_count; i++){QModelIndex index = mission_model->index(i, 4);QPushButton *button = static_cast<QPushButton*>(index.internalPointer());ui->tableView->setIndexWidget(index, button);}ui->tableView->horizontalHeader()->resizeSection(0,80);ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);ui->tableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);ui->tableView->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch);//ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);ui->tableView->verticalHeader()->hide();//  ui->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section{background:#3a3e46;color: white;}");
}

MissionModel.h

#ifndef MISSIONMODEL_H
#define MISSIONMODEL_H#include <QAbstractTableModel>
#include <QJsonObject>
#include <QJsonArray>
#include <QPushButton>
#include <QMap>class MissionModel : public QAbstractTableModel
{Q_OBJECT
public:MissionModel(QString plane_name_t, QString mission_name, QObject *parent = nullptr);virtual ~MissionModel() override;// Header:QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;// Basic functionality:int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;bool setData(const QModelIndex &index, const QVariant &value, int role) override;void refresh();Qt::ItemFlags flags(const QModelIndex & index) const override ;QJsonObject getItemData(int index);void init_data();signals:void missionFollow_send(QVariant missionName, QVariant missionColor);void namePlate_show(QVariant missionName);private:QList<QString> headtitle;QJsonArray dataList;QMap<int,QPushButton* > color_buttons;QString plane_name;QString mission_name;QString file_name;
};#endif // MISSIONMODEL_H

MissionModel.cpp

#include "missionmodel.h"#include <QCoreApplication>
#include <QFile>
#include <QJsonArray>
#include <QMessageBox>
#include <QColorDialog>#include "global.h"
#include "./ui/util/jsontool.h"MissionModel::MissionModel(QString plane_name_t, QString mission_name_t, QObject *parent): plane_name(plane_name_t), mission_name(mission_name_t), QAbstractTableModel(parent)
{headtitle<< QStringLiteral("序号") << QStringLiteral("项目名称") << QStringLiteral("实时关注") << QStringLiteral("铭牌显示") << QStringLiteral("颜色");init_data();
}MissionModel::~MissionModel()
{foreach (QPushButton* button, color_buttons.values()) {delete button;}color_buttons.clear();
}QVariant MissionModel::headerData(int section, Qt::Orientation orientation, int role) const
{switch(role){case Qt::DisplayRole:{if (orientation == Qt::Horizontal) {return headtitle[section];}break;}
//    case Qt::FontRole:
//    {
//        QFont boldFont;
//        boldFont.setBold(true);
//        boldFont.setPixelSize(14);
//        return boldFont;
//    }case Qt::TextAlignmentRole:return Qt::AlignLeft + Qt::AlignVCenter;break;}return QVariant();
}int MissionModel::rowCount(const QModelIndex &parent) const
{return dataList.size();
}int MissionModel::columnCount(const QModelIndex &parent) const
{return headtitle.size();
}//在第4列放按钮
QModelIndex MissionModel::index(int row, int column, const QModelIndex &parent) const
{if (column == 4){return createIndex(row, column, color_buttons[row]);}elsereturn QAbstractTableModel::index(row, column, parent);
}
//在第 2,3 列放checkbox
Qt::ItemFlags MissionModel::flags(const QModelIndex &index) const
{if (index.column() == 2 || index.column() == 3)return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;return QAbstractTableModel::flags(index);
}//这里负责把数据显示到界面对应单元格
重点
setdata()的调用次数=row * col *31(枚举数)有多少行就调用多少次。每一行有多少列就调用多少次。对每一个单元格的枚举调用多少次如下图针对每个单元格的31哥枚举会调用31次data()
比如背景颜色,文本居中,文本颜色,显示内容,如果是checkbox,那么选中状态boolQt::TextAlignmentRole: Qt::DisplayRole: Qt::CheckStateRole:enum ItemDataRole {DisplayRole = 0,DecorationRole = 1,EditRole = 2,ToolTipRole = 3,StatusTipRole = 4,WhatsThisRole = 5,// MetadataFontRole = 6,TextAlignmentRole = 7,BackgroundRole = 8,ForegroundRole = 9,
#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove meBackgroundColorRole Q_DECL_ENUMERATOR_DEPRECATED = BackgroundRole,TextColorRole Q_DECL_ENUMERATOR_DEPRECATED = ForegroundRole,
#endifCheckStateRole = 10,// AccessibilityAccessibleTextRole = 11,AccessibleDescriptionRole = 12,// More general purposeSizeHintRole = 13,InitialSortOrderRole = 14,// Internal UiLib roles. Start worrying when public roles go that high.DisplayPropertyRole = 27,DecorationPropertyRole = 28,ToolTipPropertyRole = 29,StatusTipPropertyRole = 30,WhatsThisPropertyRole = 31,// ReservedUserRole = 0x0100};QVariant MissionModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();int row = index.row();int col = index.column();QJsonObject obj = dataList.at(row).toObject();switch(role){case Qt::DisplayRole:{switch (col) {case 0:return row + 1;case 1:return obj[headtitle.at(1)].toString();case 2:return obj[headtitle.at(2)].toString();case 3:return obj[headtitle.at(3)].toString();case 4:{QPushButton *button = static_cast<QPushButton*>(index.internalPointer());button->setText(obj[headtitle.at(4)].toString());//      button->setStyleSheet(QString("background-color: %1").arg(obj[headtitle.at(4)].toString()));return obj[headtitle.at(4)].toString();}default:break;}}break;case Qt::TextAlignmentRole:{if(col == 0)return Qt::AlignCenter;}return Qt::AlignLeft + Qt::AlignVCenter;break;case Qt::ForegroundRole:switch (col) {case 1://return  info.isLive? QVariant(QColor("#7ebdfd")):QVariant(QColor("#ee6666"));break;default:break;}break;case  Qt::CheckStateRole:{QJsonObject obj = dataList.at(row).toObject();if (index.column() == 2){return obj[headtitle.at(2)].toBool() == true ? Qt::Checked : Qt::Unchecked;}else if (index.column() == 3){return obj[headtitle.at(3)].toBool() == true ? Qt::Checked : Qt::Unchecked;}}}return QVariant();
}bool MissionModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if(!index.isValid())return false;int row = index.row();int col = index.column();QModelIndex m_index_name = this->index(row,1);QModelIndex m_index_color = this->index(row,4);QVariant missionName = this->data(m_index_name);QVariant missionColor = this->data(m_index_color);
//    if (role == Qt::CheckStateRole && (col == 2 || col == 3) )
//    {
//        QJsonObject obj = dataList[row].toObject();
//        obj[headtitle.at(col)] = value == Qt::Checked;
//        dataList[row] = obj;//        if( !JsonTool::save_json_file<QJsonArray>(file_name, dataList) )
//        {
//            QMessageBox::information( nullptr, QStringLiteral("修改失败"), QStringLiteral("修改失败"));
//        }
//    }if (role == Qt::CheckStateRole && col == 2 ){QJsonObject obj = dataList[row].toObject();obj[headtitle.at(col)] = value == Qt::Checked;dataList[row] = obj;if(obj[headtitle.at(2)].toBool() == true){emit missionFollow_send(missionName, missionColor);return true;}if( !JsonTool::save_json_file<QJsonArray>(file_name, dataList) ){QMessageBox::information( nullptr, QStringLiteral("修改失败"), QStringLiteral("修改失败"));}}else if (role == Qt::CheckStateRole && col == 3 ){QJsonObject obj = dataList[row].toObject();obj[headtitle.at(col)] = value == Qt::Checked;dataList[row] = obj;if(obj[headtitle.at(2)].toBool() == true){emit namePlate_show(missionName);return true;}if( !JsonTool::save_json_file<QJsonArray>(file_name, dataList) ){QMessageBox::information( nullptr, QStringLiteral("修改失败"), QStringLiteral("修改失败"));}}return true;
}void MissionModel::refresh()
{beginResetModel();//...endResetModel();
}//这个是我自己写的
QJsonObject MissionModel::getItemData(int index)
{return dataList.at(index).toObject();
}void MissionModel::init_data()
{file_name = QString("%1/config/fc_config/%2_%3.json").arg(QCoreApplication::applicationDirPath()).arg(plane_name).arg(mission_name);if(QFile::exists(file_name)){QJsonArray json_array = JsonTool::load_jsonarray_file(file_name);//dataList. .clear();for(int i = 0; i < json_array.size(); i++){dataList.append(json_array.at(i).toObject());}}else{//dataList.clear();QString tmp_file_name = QString("%1/config/fc_config/%2.json").arg(QCoreApplication::applicationDirPath()).arg(plane_name);        QJsonObject obj = JsonTool::load_json_file(tmp_file_name);QStringList keys = obj.keys();if(keys.empty()){qWarning()<<"read a empty obj: "<<tmp_file_name<<endl;return;}QJsonArray json_array;foreach (QString key, keys){QJsonObject item;item.insert(QStringLiteral("项目名称"), key);item.insert(QStringLiteral("实时关注"), false);item.insert(QStringLiteral("铭牌显示"), false);item.insert(QStringLiteral("颜色"), "#ffffff");json_array.append(item);dataList.append(item);}JsonTool::save_json_file<QJsonArray>(file_name, json_array);}color_buttons.clear();for(int i = 0; i<dataList.size(); i++){QPushButton* button_p = new QPushButton();connect(button_p, &QPushButton::clicked, this, [=](){QColor color = QColorDialog::getColor();if (color.isValid()) {QPushButton *button = qobject_cast<QPushButton *>(sender());if (button){//         button->setStyleSheet(QString("background-color: %1").arg(color.name()));QJsonObject obj = dataList[i].toObject();obj[headtitle.at(4)] = color.name();dataList[i] = obj;if( !JsonTool::save_json_file<QJsonArray>(file_name, dataList) ){QMessageBox::information( nullptr, QStringLiteral("修改失败"), QStringLiteral("修改失败"));}}}});color_buttons.insert(i, button_p);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文导读 | 大语言模型中应用到的强化学习算法

摘要 在最近取得广泛关注的大规模语言模型&#xff08;LLM&#xff09;应用强化学习&#xff08;RL&#xff09;进行与人类行为的对齐&#xff0c;进而可以充分理解和回答人的指令&#xff0c;这一结果展现了强化学习在大规模NLP的丰富应用前景。本文介绍了LLM中应用到的RL技术…

【GH】【EXCEL】P6: Shapes

文章目录 componentslinepicture components line picture Picture A Picture object Input parameters: Worksheet (Generic Data) A Worksheet, Workbook, Range Object, Excel Application, or Text Worksheet NameName (Text) An optional object nameLocation (Point) A p…

Eclipse SVN 插件在线下载地址

Eclipse SVN 插件 Subversive 在线安装 1、选择help下的install new software 2、点击 add 3、Name随便写&#xff0c;Location输入&#xff1a; https://download.eclipse.org/technology/subversive/4.8/release/latest/ 点击Add 4、然后一直下一步&#xff0c;Finish&am…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中&#xff0c;使用 methods 选项定义获取用户信…

鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙中巧夺天工

gn是什么? gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系. 为什么会有gn,说是有个叫even的谷歌负责构建系统的工程师在使用传统的makefile构建chrome时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具gnninja,然后就被广泛的使用…

《机器学习》—— 通过下采样方法实现逻辑回归分类问题

文章目录 一、什么是下采样方法&#xff1f;二、通过下采样方法实现逻辑回归分类问题三、下采样的优缺点 一、什么是下采样方法&#xff1f; 机器学习中的下采样&#xff08;Undersampling&#xff09;方法是一种处理不平衡数据集的有效手段&#xff0c;特别是在数据集中某些类…

【每日一题】【区间合并】【贪心 模拟】多米诺骨牌 牛客小白月赛99 E题 C++

牛客小白月赛99 E题 多米诺骨牌 题目背景 牛客小白月赛99 题目描述 样例 #1 样例输入 #1 3 6 1 1 1 1 3 2 1 4 3 2 7 9 11 6 2 1 1 1 3 2 1 4 3 2 7 9 11 5 4 1 4 1 1 2 1 2 3 6 8样例输出 #1 3 6 5做题思路 按照玩多米诺骨牌的方式。 先将多米诺骨牌按照骨牌位置从小…

Python二级知识点

在阅读之前&#xff0c;感谢大家的关注和点赞。祝你们都能心想事成、健健康康。 一.数据流程图 一般这道题是经常考的&#xff0c;有向箭头--->表示数据流。圆圈○表示加工处理。 二.字典如何比较大小 字典类型是如何比较大小的呢&#xff0c;是使用字典的键来比较大小&…

redis | Django小项目之Mysql数据库和Redis缓存的应用

Django小项目 需求整体架构图技术细节环境配置各文件配置settings.pyurls.pyviews.pyuser_update.html 结果相关代码补充r.hgetall(cacahe_key)new_data {k.decode():v.decode() for k,v in data.items()} 需求 整体架构图 技术细节 环境配置 django-admin startprojrct rmysi…

zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 zdppy_cache框架的低代码实现

遗留问题 1、封装API2、有账号密码3、查询所有有效的具体数据&#xff0c;也就是缓存的所有字段 封装查询所有有效具体数据的方法 基本封装 def get_all(self, is_activeTrue, limit100000):"""遍历数据库中所有的key&#xff0c;默认查询所有没过期的:para…

深度学习一(Datawhale X 李宏毅苹果书 AI夏令营)

一&#xff0c;机器学习基础 机器学习&#xff08;Machine Learning, ML&#xff09;是让机器具备学习能力的过程&#xff0c;其核心在于使机器能够自动寻找并应用复杂的函数&#xff0c;以解决各种任务如语音识别、图像识别和策略决策&#xff08;如AlphaGo&#xff09;。这些…

顺序表的顺序表示—动态分配

顺序表的顺序表示—动态分配 代码实现 #include <stdio.h> #include <stdlib.h> #define InitSize 15 // 初始化扩容长度typedef struct{int *data; // 动态分配数组的指针int MaxSize;int length; // 当前长度 }SeqList;void InitList(SeqList &L){// 申请一…

得峰(Deffad)A17G本本 - 安装debian12

文章目录 得峰(Deffad)A17G本本 - 安装debian12概述笔记电源插头设置硬件参数修复win10预装的软件列表做debain12的安装U盘从U盘启动引导用U盘装debian12通过U盘安装debian12到本本原有硬盘上成功配置debian12备注备注END 得峰(Deffad)A17G本本 - 安装debian12 概述 和同学讨…

YOLOv9改进策略【卷积层】| 利用MobileNetv4中的UIB、ExtraDW优化RepNCSPELAN4

一、本文介绍 本文记录的是利用ExtraDW优化YOLOv9中的RepNCSPELAN4&#xff0c;详细说明了优化原因&#xff0c;注意事项等。ExtraDW是MobileNetv4模型中提出的新模块&#xff0c;允许以低成本增加网络深度和感受野&#xff0c;具有ConvNext和IB的组合优势。可以在提高模型精度…

uni-app项目搭建和模块介绍

工具:HuilderX noed版本:node-v17.3.1 npm版本:8.3.0 淘宝镜像:https://registry.npmmirror.com/ 未安装nodejs可以进入这里https://blog.csdn.net/a1241436267/article/details/141326585?spm1001.2014.3001.5501 目录 1.项目搭建​编辑 2.项目结构 3.使用浏览器运行…

解决MySQL的PacketTooBigException异常问题

一、背景 在大数据量导入mysql的时候&#xff0c;提示错误Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large 原因是MySQL的max_allowed_packet设置最大允许接收的数据包过小引起的&#xff0c;默认的max_allowed_packet如果不设置&…

Qt 环境搭建

sudo apt-get upadte sudo apt-get install qt4-dev-tools sudo apt-get install qtcreator sudo apt-get install qt4-doc sudo apt-get install qt4-qtconfig sudo apt-get install qt-demos编译指令 qmake -projectqmakemake实现Ubuntu20,04 与Windows之间的复制粘贴 安装o…

API 的多版本管理,如何在 Apifox 中操作?

开放 API 是技术团队向外部提供服务和数据的关键手段。随着业务的发展和技术的更新&#xff0c;API 也需要不断进行版本迭代。这种迭代通常是为了满足市场需求&#xff0c;优化现有功能&#xff0c;增加新特性&#xff0c;或者修复漏洞。 在多个版本共存的情况下&#xff0c;团…

NLP从零开始------12. 关于前十一章补充(英文分词)

相较于基础篇章&#xff0c;这一部分相较于基础篇减少了很多算法推导&#xff0c;多了很多代码实现。 1.英文词规范化 英文词规范化一般分为标准化缩写,大小写相互转化&#xff0c;动词目态转化等。 1.1 大小写折叠 大小写折叠( casefolding) 是将所有的英文大写字母转化成小…

stm32MX+freertos在创建task时,选项的含义

任务名称&#xff08;Task Name&#xff09;&#xff1a; 用于标识任务的名称&#xff0c;便于调试和日志记录。 优先级&#xff08;Priority&#xff09;&#xff1a; 任务的执行优先级。FreeRTOS支持多个优先级&#xff0c;高优先级的任务会优先于低优先级的任务执行。 堆栈…