扫描到网站目录然后怎么做/网站快照优化公司

扫描到网站目录然后怎么做,网站快照优化公司,wordpress 幻灯片插件下载,学做网站在哪里什么是MVC架构: MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controll…

什么是MVC架构:

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式最早由Trygve Reenskaug在1978年提出[1],是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。软件系统透过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以依据自身的专长分组:

模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

视图(View) - 界面设计人员进行图形界面设计。

控制器(Controller)- 负责转发请求,对请求进行处理。

Qt的MVD架构又是什么?

模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

视图(View) - 界面设计人员进行图形界面设计。

代理(Delegate)- 负责转发请求,对请求进行处理

UI样式实现:

其实你就只要去实现下面的代码,你就能完全使用MVD架构,随心所欲

class TableModel : public QAbstractTableModel
{Q_OBJECT
public:enum Columns { Element = 0, Value, Count = Value + 1 };explicit TableModel(QObject *parent = nullptr);Qt::ItemFlags flags(const QModelIndex &index) const;int rowCount(const QModelIndex &parent = QModelIndex()) const;int columnCount(const QModelIndex &parent = QModelIndex()) const;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole);void addElement(const QString &element, int value);private:};
class TableDelegate : public QStyledItemDelegate
{Q_OBJECT
public:explicit TableDelegate(QObject *parent = nullptr);QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;void setEditorData(QWidget *editor, const QModelIndex &index) const;void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};//--------------------cpp---------------------
#include "tablemodel.h"TableModel::TableModel(QObject *parent) : QAbstractTableModel(parent)
{
}Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{return QAbstractTableModel::flags(index);
}int TableModel::rowCount(const QModelIndex &parent) const
{return 2;
}int TableModel::columnCount(const QModelIndex &parent) const
{return Count;
}QVariant TableModel::data(const QModelIndex &index, int role) const
{return QVariant();
}QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{return QAbstractTableModel::headerData(section, orientation, role);
}bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if (!index.isValid() || index.row() < 0 || index.row() >= mElements.count()){return false;}return false;
}
void TableModel::addElement(const QString &element, int value)
{
}TableDelegate::TableDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}QWidget *TableDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const
{return QStyledItemDelegate::createEditor(parent, option, index);
}void TableDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{QStyledItemDelegate::setEditorData(editor, index);
}void TableDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{QStyledItemDelegate::setModelData(editor, model, index);
}void TableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QStyledItemDelegate::paint(painter, option, index);
}void TableDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,const QModelIndex &index) const
{Q_UNUSED(index)editor->setGeometry(option.rect);
}

Model

class QAbstractItemModel {virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0;virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) = 0;virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;virtual Qt::ItemFlags flags(const QModelIndex &index) const = 0;
};

实现上面的代码,你就能使用MVD架构,理解Qt的框架,

View 与 Model 的绑定流程

当调用 view->setModel(model)时:
  1. 存储指针:View 内部保存QAbstractItemModel*类型的指针指向用户的 Model 对象
  2. 信号连接:View 自动连接 Model 的信号(如 dataChanged())到自身的槽(如 update()),实现数据变化时的视图更新
  3. 数据请求:当视图需要渲染时,会通过 Model 指针调用虚函数(如data()rowCount())
// 伪代码:QAbstractItemView 的渲染流程
void QAbstractItemView::paintEvent() {for (int row = 0; row < model->rowCount(); ++row) { // 多态调用 model->rowCount()QVariant data = model->data(index(row));        // 多态调用 model->data()delegate->paint(painter, data);                 // 多态调用 delegate->paint()}
}

Delegate 的动态调用机制

当设置 view->setItemDelegate(delegate)  后:
  1. 渲染阶段:View 在绘制每个数据项时,调用delegate->paint(painter, option, index)
  2. 编辑阶段:当用户双击单元格时,调用delegate->createEditor()创建编辑器
  3. 数据回写:编辑器关闭时,调用delegate->setModelData()将数据写回 Model
// 伪代码:委托的编辑器创建过程
void QAbstractItemView::edit(const QModelIndex &index) {QWidget* editor = delegate->createEditor(parent, option, index); // 多态调用connect(editor, &QWidget::destroyed, [this, index]() {delegate->setModelData(editor, model, index); // 多态调用});
}

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

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

相关文章

(C语言)理解 回调函数 和 qsort函数

一. 回调函数 1. 什么是回调函数&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是通过 函数指针 调用的函数。其本质是&#xff1a; 将函数作为参数传递给另一个函数&#xff0c;并在特定条件下被调用&#xff0c;实现 反向控制。 2. 回调函数的使用 回调函…

vscode记录

vs code 下载安装&#xff0c;git 配置&#xff0c;插件安装_vscode安装git插件-CSDN博客 手把手教你在VS Code中使用 Git_vscode如何输入git命令-CSDN博客 VS Code | 如何快速重启VS Code&#xff1f;_vscode 怎么一键全部重启-CSDN博客 1&#xff0c;安装插件与git集成 2&am…

大数据学习(80)-数仓分层

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…

SpringSecurity——前后端分离登录认证

SpringSecurity——前后端分离登录认证的整个过程 前端&#xff1a; 使用Axios向后端发送请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><script src"https://cdn…

qt下载和安装教程国内源下载地址

qt不断在更新中&#xff0c;目前qt6日渐成熟&#xff0c;先前我们到官方下载或者国内镜像直接可以下载到exe文件安装&#xff0c;但是最近几年qt官方似乎在逐渐关闭旧版本下载通道&#xff0c;列为不推荐下载。但是qt5以其广泛使用和稳定性&#xff0c;以及积累大量代码使得qt5…

Mysql架构理论部分

Mysql架构是什么&#xff1f;实际可以理解为执行一条sql语句所要经历的阶段有哪些&#xff01; 1.连接层 &#xff08;1&#xff09;客户端发起连接 客户端通过TCP/IP、Unix Socket或命名管道等方式向Mysql服务器发起链接请求 想要了解tcp与udp的区别&#xff0c;可以参考这…

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…

【服务器】RAID0、RAID1、RAID5、RAID6、RAID10异同与应用

目录 ​编辑 一、RAID概述 1.1 磁盘阵列简介 1.2 功能 二、RAID级别 2.1 RAID 0&#xff08;不含校验与冗余的条带存储&#xff09; 2.2 RAID1&#xff08;不含校验的镜像存储&#xff09; 2.3 RAID 5 &#xff08;数据块级别的分布式校验条带存储&#xff09; 4、RAI…

MySQL身份验证的auth_socket插件

在Ubuntu 20.04 LTS上&#xff0c;MySQL 8.0默认使用auth_socket插件进行身份验证&#xff0c;可能存在意想不到的情况。 一、auth_socket插件 在使用sudo mysql或通过sudo切换用户后执行任何MySQL命令时&#xff0c;不需要输入密码或错误密码都可以正常登入mysql数据库&…

使用Python在Word中创建、读取和删除列表 - 详解

目录 工具与设置 Python在Word中创建列表 使用默认样式创建有序&#xff08;编号&#xff09;列表 使用默认样式创建无序&#xff08;项目符号&#xff09;列表 创建多级列表 使用自定义样式创建列表 Python读取Word中的列表 Python从Word中删除列表 在Word中&#xff…

软考-软件设计师-计算机网络

一、七层模型 中继器&#xff1a;信号会随着距离的增加而逐渐衰减&#xff0c;中继器可以接受一端的信息再将其原封不动的发给另一端&#xff0c;起到延长传输距离的作用&#xff1b; 集线器&#xff1a;多端口的中继器&#xff0c;所有端口公用一个冲突域&#xff1b; 网桥&…

关于Flask框架30道面试题及解析

文章目录 基础概念1. 什么是Flask?其核心特性是什么?2. Flask和Django的主要区别?3. 解释Flask中的“路由”概念。如何定义动态路由?核心组件4. Flask的请求上下文(Request Context)和应用上下文(Application Context)有什么区别?5. 如何访问请求参数?POST和GET方法的…

C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革

文章目录 一、constexpr 在 <algorithm> 中的应用1. 编译时排序2. 编译时查找 二、constexpr 在 <utility> 中的应用1. 编译时交换2. 编译时条件交换 三、constexpr 在 <complex> 中的应用1. 编译时复数运算 四、总结 C20 对 constexpr 的增强是其最引人注目…

conda create之后,以前的conda env list 只能看到环境路径 没有环境名称了

1.命令 conda env list 看到的显示如下&#xff1a; 左边这列的"base"&#xff0c;指向的路径和其它环境变量安装的路径不一致。 这时需要通过"activate [anaconda的环境路径]"和"source activate"回到anaconda&#xff1a; 2.执行切换命令 …

vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag

vulnhub-Tr0ll ssh爆破、wireshark流量分析&#xff0c;exp、寻找flag。思维导图带你清晰拿到所以flag 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185经典扫描三件套&#xff0c;…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划&#xff0c;其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的&#xff0c;但这样表示的话&#xff0c;并不利于我们去做规划&#xff0c;所…

大摩闭门会:250321 学习总结报告

如果图片分辨率不足&#xff0c;可右键图片在新标签打开图片或者下载末尾源文件进行查看 本文只是针对视频做相应学术记录&#xff0c;进行学习讨论使用

深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析

引言 Spring Boot 是当今 Java 开发中最流行的框架之一&#xff0c;它以简化配置和快速开发著称。然而&#xff0c;要真正掌握 Spring Boot&#xff0c;理解其应用的生命周期是至关重要的。本文将深入探讨 Spring Boot 应用的生命周期&#xff0c;从启动到关闭的各个阶段&…