当前位置: 首页 > news >正文

Qt之QDjango-db的简单使用

QDjango是一款由C++编写、依托于Qt库的Web开发框架,其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集,帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango,项目结构中存在db和http两部分,db为Qt的ORM实现,该模块包装一下可以作为简单的ORM库使用。
QDjango
如果项目中不想SQL语句写的到处都是,一个简单ORM库还是有必要的,同时也能避免依赖某一种数据库。以下工程为简单包装QDjango-db的简单实现。当然个人不建议使用该模块,主要QDjango已经很久不维护了,可以使用ODB来做相同的工作。
在这里插入图片描述

// 以下为QDjango-db的简单包装// 创建template<typename T>bool createHandle() {QDjango::registerModel<T>();return QDjango::createTables();}// 增加void addHandle(std::function<void()> f) { f();}// 删除void delHandle(std::function<void()> f) { f();}// 更改template<typename T>bool modifyHandle(const QVariantMap &fields) {return QDjangoQuerySet<T>().update(fields);}// 查询:不能嵌套查询,只能简单查询,复杂的可以研究QDjangoQuerySet类template<typename T>T* selectHandle(const QStringList& slParam, QDjangoWhere::Operation op) {Q_ASSERT(slParam.size() == 2);return QDjangoQuerySet<T>().get(QDjangoWhere(slParam[0], op, slParam[1]));}// 清表template<typename T>bool clearHandle() {return QDjangoQuerySet<T>().remove();}// 删表bool dropHandle() {return QDjango::dropTables();}
class User : public QDjangoModel
{Q_OBJECTQ_PROPERTY(QString username READ username WRITE setUsername)Q_PROPERTY(QString first_name READ firstName WRITE setFirstName)Q_PROPERTY(QString last_name READ lastName WRITE setLastName)Q_PROPERTY(QString email READ email WRITE setEmail)Q_PROPERTY(QString password READ password WRITE setPassword)Q_PROPERTY(bool is_active READ isActive WRITE setIsActive)Q_PROPERTY(bool is_staff READ isStaff WRITE setIsStaff)Q_PROPERTY(bool is_superuser READ isSuperUser WRITE setIsSuperUser)Q_PROPERTY(QDateTime date_joined READ dateJoined WRITE setDateJoined)Q_PROPERTY(QDateTime last_login READ lastLogin WRITE setLastLogin)Q_CLASSINFO("username", "max_length=30")Q_CLASSINFO("first_name", "max_length=30")Q_CLASSINFO("last_name", "max_length=30")Q_CLASSINFO("password", "max_length=128")
public:User(QObject *parent = 0);QString username() const;void setUsername(const QString &username);QString firstName() const;void setFirstName(const QString &firstName);QString lastName() const;void setLastName(const QString &lastName);QString email() const;void setEmail(const QString &email);QString password() const;void setPassword(const QString &password);// flagsbool isActive() const;void setIsActive(bool isActive);bool isStaff() const;void setIsStaff(bool isStaff);bool isSuperUser() const;void setIsSuperUser(bool isSuperUser);// datesQDateTime dateJoined() const;void setDateJoined(const QDateTime &dateJoined);QDateTime lastLogin() const;void setLastLogin(const QDateTime &lastLogin);
private:QString m_username;QString m_firstName;QString m_lastName;QString m_email;QString m_password;bool m_isActive;bool m_isStaff;bool m_isSuperUser;QDateTime m_dateJoined;QDateTime m_lastLogin;
};
    if (qDjangoHandle::getSingleInstance().initialiseDatabase()){if (qDjangoHandle::getSingleInstance().createHandle<User>()) {// addqDjangoHandle::getSingleInstance().addHandle([&](){User user;user.setUsername("root");user.setFirstName("Li");user.setLastName("si");user.setPassword("1234");if (!user.save()) {qDebug() << "save failed";}});// modifyQVariantMap vmap;vmap["username"] = "root1";qDjangoHandle::getSingleInstance().modifyHandle<User>(vmap);// queryQStringList slCondition;slCondition << "username" << "root1";User* p = qDjangoHandle::getSingleInstance().selectHandle<User>(slCondition, QDjangoWhere::Equals);if (p != nullptr)qDebug() << p->firstName() << p->lastName();}}

相关文章:

Qt之QDjango-db的简单使用

QDjango是一款由C编写、依托于Qt库的Web开发框架&#xff0c;其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集&#xff0c;帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…...

缓存、数据库双写一致性解决方案

双写一致性问题的核心是确保数据库和缓存之间的数据同步&#xff0c;以避免缓存与数据库数据不同步的问题&#xff0c;尤其是在高并发和异步环境下。本文将探讨双写一致性面临的主要问题和解决方案&#xff0c;重点关注最终一致性。 本文讨论的是最终一致性问题 双写一致性面…...

SUnet: A multi-organ segmentation network based on multiple attention【医学图像分割】

一、论文信息 1.1、中文名称 名称&#xff1a;SUnet&#xff1a;基于多重注意力的多器官分割网络 1.2、论文关键词 医学图像分割、Transformer、注意力机制、高效特征融合模块 1.3、核心概述 本文提出了一种新颖有效的医学图像分割方法 SUnet&#xff0c;用于腹部和胸部的多…...

uniapp实现“到这儿去”、拨打电话功能

"到这儿去" 在 UniApp 中实现“到这儿去”的功能,即调起地图导航至指定位置,对于不同的平台(小程序、H5、App)有不同的处理方式。下面将简单介绍如何在这些平台上实现该功能,并讨论位置信息的获取。后面需求会用到,先来找一些相关资料,并不一定很准确,但也来…...

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…...

【博客之星】2024年度个人成长、强化学习算法领域总结

&#x1f4e2;在2025年初&#xff0c;非常荣幸能通过审核进入到《2024年度CSDN博客之星总评选》TOP300的年度评选中&#xff0c;排名40。这还是第一次来到这个阶段&#xff0c;作为一名博士研究生&#xff0c;还是备受鼓舞的。在这里我将以回顾的方式讲述一下这一年在CSDN中走过…...

HTML5 Canvas实现的跨年烟花源代码

以下是一份基于HTML5 Canvas实现的跨年烟花源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">…...

使用通用预训练范式为 3D 基础模型铺平道路

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;&#xff0c;本次是英文需要英文功底扎实的阅读。 Abstract In contrast to numerous NLP and 2D vision foundational models, learning a 3D foundational model poses considerably greater challenge…...

SpringMVC (2)

目录 1. RequestMapping 注解介绍 2. RequestMapping 使用 3. RequestMapping与请求方式 3.1 RequestMapping 支持Get和Post类型的请求 3.2 RequestMapping 指定接收某种请求 3.3 GetMapping和PostMapping 4. 传参 4.1 通过查询字符串传参 4.2 在 Body 中传参 4.2.1 …...

【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)

文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1&#xff1a;将旧版 Python 代码转换为新版写法2.3. 练习2&#xff1a;根据列表内容批量创建 Shell 脚本2.4. 练习3&#xff1a;对电话号码作格式化处理2.5. 练习4&…...

爬楼梯问题(Leetcode 第70题)

爬楼梯问题&#xff08;Leetcode 第70题&#xff09; 问题描述 假设你正在爬楼梯。每次你可以爬 1 个或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。…...

6.5 正定矩阵

一、正定矩阵 这一节关注的是特征值都是正数的对称矩阵。如果对称使得矩阵很重要&#xff0c;那么这个额外的性质&#xff08;所有的 λ > 0 \lambda>0 λ>0&#xff09;会使得它更加的特殊。我们所说的特殊并不表示它稀有&#xff0c;特征值都是正数的对称矩阵几乎…...

verilog笔记1

1. 阻塞赋值 阻塞赋值&#xff0c;顾名思义即在一个 always 块中&#xff0c;后面的语句会受到前语句的影响&#xff0c;具体来说就是在同一个always 中&#xff0c;一条阻塞赋值语句如果没有执行结束&#xff0c;那么该语句后面的语句就不能被执行&#xff0c;即被“阻塞”。也…...

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…...

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1&#xff1a; 本地切到远程分支&#xff0c;对齐要对齐的base分支&#xff0c;举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2&#xff1a; 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…...

监控与调试:性能优化的利器 — ShardingSphere

在分布式数据库系统中&#xff0c;监控和调试是确保系统高效运行的关键。ShardingSphere 提供了多种监控和调试工具&#xff0c;帮助开发者实时跟踪和优化性能&#xff0c;识别瓶颈&#xff0c;进行故障排查&#xff0c;从而提升系统的稳定性和响应速度。本文将介绍如何使用 Sh…...

LLVM - 编译器前端 - 理解BNF(巴科斯-诺尔范式)

一:概述 BNF(Backus-Naur Form,巴科斯-诺尔范式)是一种用于描述上下文无关文法的形式语言,广泛应用于定义编程语言、协议和文件格式的语法规则。 下面是一小段类Pascal编程语言,这个编程语言就可以用BNF描述。用BNF描述编程语言的语法规则之后,就可以根据这个规则生成抽…...

服务化架构 IM 系统之应用 MQ

在微服务化系统中&#xff0c;存在三个最核心的组件&#xff0c;分别是 RPC、注册中心和MQ。 在前面的两篇文章&#xff08;见《服务化架构 IM 系统之应用 RPC》和《服务化架构 IM 系统之应用注册中心》&#xff09;中&#xff0c;我们站在应用的视角分析了普适性的 RPC 和 注…...

ELF2开发板(飞凌嵌入式)基本使用的搭建

ELF2开发板&#xff08;飞凌嵌入式&#xff09; 开箱包裹内容 打开包装&#xff0c;你可以看到以下物品 一个绿联的usb3.0读卡器、sandisk的32g内存卡(太好了)rk3588 4g32g emmc版本ELF2开发板输出为12v 3A的电源适配器&#xff08;和ipad的充电器外观好像&#xff09; 图1 外…...

Appium(四)

一、app页面元素定位 1、通过id定位元素: resrouce-id2、通过ClassName定位&#xff1a;classname3、通过AccessibilityId定位&#xff1a;content-desc4、通过AndroidUiAutomator定位5、通过xpath定位xpath、id、class、accessibility id、android uiautomatorUI AutomatorUI自…...

AgentCPM模型内存与显存优化详解:低成本GPU部署方案

AgentCPM模型内存与显存优化详解&#xff1a;低成本GPU部署方案 想在自己的电脑上跑一个像AgentCPM这样的大模型&#xff0c;是不是总被“爆显存”的提示搞得头疼&#xff1f;看着动辄几十GB的显存需求&#xff0c;再看看自己显卡上那可怜的8GB、12GB&#xff0c;是不是感觉梦…...

Pixel Aurora Engine实战教程:生成可导入Aseprite的像素图层文件

Pixel Aurora Engine实战教程&#xff1a;生成可导入Aseprite的像素图层文件 1. 教程概述 Pixel Aurora Engine是一款专为像素艺术创作设计的AI工具&#xff0c;它能将文字描述转化为高质量的像素艺术作品。本教程将重点介绍如何生成可直接导入Aseprite&#xff08;流行的像素…...

Notepad++效率倍增:集成Phi-4-mini-reasoning的代码片段智能生成

Notepad效率倍增&#xff1a;集成Phi-4-mini-reasoning的代码片段智能生成 1. 为什么Notepad需要AI加持&#xff1f; 作为一款轻量级代码编辑器&#xff0c;Notepad凭借其快速启动和简洁界面赢得了全球开发者的喜爱。但面对日益复杂的开发需求&#xff0c;传统编辑器在智能辅…...

QWEN-AUDIO内容创作提效:营销文案→自然语音→一键导出WAV全流程

QWEN-AUDIO内容创作提效&#xff1a;营销文案→自然语音→一键导出WAV全流程 1. 引言&#xff1a;语音创作的新时代 你有没有遇到过这样的情况&#xff1a;写好了精彩的营销文案&#xff0c;却苦于找不到合适的配音&#xff1f;或者需要为视频内容添加语音&#xff0c;但自己…...

AI时代的算法思维:大经典排序学习媚

引言 在现代软件开发中&#xff0c;性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序&#xff0c;性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言&#xff0c;性能优化涉及多个层面&#x…...

别再只盯着UNet了!用TransFuse在医疗图像分割上实现又快又准(附PyTorch代码)

TransFuse&#xff1a;医疗图像分割的下一代混合架构实战指南 在息肉检测和皮肤病变分析等医疗图像分割任务中&#xff0c;我们常常陷入一个两难困境&#xff1a;选择CNN架构能够保留丰富的局部细节但难以建模全局关系&#xff0c;而纯Transformer模型虽然擅长捕捉长距离依赖却…...

基于MATLAB的GNSS软件接收机跟踪环路详解——自学笔记(3)

1. GNSS软件接收机跟踪环路核心原理 当你第一次打开MATLAB的GNSS软件接收机跟踪函数时&#xff0c;可能会被满屏的变量和运算吓到。别担心&#xff0c;跟踪环路本质上就是个"数字锁匠"——它的任务就是紧紧咬住卫星信号不放。想象一下老式收音机调频&#xff0c;你需…...

现代C++智能指针详解

现代C智能指针详解&#xff1a;安全内存管理的利器在C开发中&#xff0c;内存管理一直是程序员需要谨慎处理的难题。传统裸指针容易导致内存泄漏、悬垂指针等问题&#xff0c;而现代C引入的智能指针通过RAII机制为内存管理带来了革命性改变。本文将深入解析智能指针的核心特性与…...

AI开发-python-langchain框架(--自定义Tool )挪

起因是我想在搞一些操作windows进程的事情时&#xff0c;老是需要右键以管理员身份运行&#xff0c;感觉很麻烦。就研究了一下怎么提权&#xff0c;顺手瞄了一眼Windows下用户态权限分配&#xff0c;然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧&#xff…...

DS3231高精度RTC驱动开发与工业级可靠性设计

1. DS3231高精度实时时钟芯片深度解析与嵌入式驱动开发实践DS3231 是 Maxim Integrated&#xff08;现为 Analog Devices&#xff09;推出的 IC 接口高精度温补晶体振荡器&#xff08;TCXO&#xff09;集成实时时钟&#xff08;RTC&#xff09;芯片&#xff0c;广泛应用于工业控…...