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

QT控件 修改QtTreePropertyBrowser自定义属性编辑器源码,添加第一列标题勾选,按钮,右键菜单事件等功能

头阵子遇到一个需要修改QtTreePropertyBrowser控件的需求,QT开发做这么久了,这个控件倒是第一次用,费了点时间研究,在这里做个简单的总结。
QtTreePropertyBrowser控件 是 Qt 解决方案 (Qt Solutions) 中的一个组件,用于创建和管理属性浏览器界面。它提供了一个树形结构的属性编辑器,能实现自定义属性的编辑,支持大部分QVariant数据类型,
以前实现属性编辑器这种功能我都是使用的QTreeWidget实现的,但是有了QtTreePropertyBrowser控件这个控件,功能实现起来就简单了。

目录导读

    • 前言
    • 源码修改
      • Qss样式支持 修改
        • QComboBox 支持qss修改项行高
        • 修改QtTreePropertyBrowser控件的每行高度
      • 修改控件
        • 添加标题允许勾选,添加设置按钮
        • 设置修改自定义属性表 表头名称,获取QtTreeWidget控件等
        • 根据鼠标坐标 获取选中属性
    • 调用示例

前言

QtTreePropertyBrowser控件 不在QT的的UI设计器里面,如果要使用QtTreePropertyBrowser控件,需要注意到安装目录下的Src文件夹中查找(前提是安装qt的时候下载了Src源码文件)

  • 参考目录:

(在Pro头文件夹中添加)
include($$[QT_INSTALL_PREFIX]/../Src/qttools/src/shared/qtpropertybrowser/qtpropertybrowser.pri)

  • 支持的属性数据类型:

大部分QVariant数据类型,包括点,矩形,时间,字体,颜色等都支持在线编辑修改

默认已处理类型:
QVariant::Int
QVariant::Double
QVariant::Bool
QVariant::String
QVariant::Date
QVariant::Time
QVariant::DateTime
QVariant::KeySequence
QVariant::Char
QVariant::Locale
QVariant::Point
QVariant::PointF
QVariant::Size
QVariant::SizeF
QVariant::Rect
QVariant::RectF
QVariant::Color
QVariant::SizePolicy
QVariant::Font
QVariant::Cursor

  • 实现效果:

通过对QtTreePropertyBrowser控件的源码简单修改,实现添加标题勾选,单击按钮,右键事件等功能。
在这里插入图片描述
需要注意的是 不同QT版本下的QtTreePropertyBrowser控件源码,不一定能直接编译
使用时最好使用同一版本下的源码文件,
例如我使用的Qt5.13.1版本的QtTreePropertyBrowser控件源码在Qt5.15.2版本下Msvc2019编译器无法编译!
相关参考:
官方案例 qtpropertybrowser/examples
详解Qt5.12.9属性表控件:QtPropertyBrowser的使用示例/折叠/展开/小数位数/QSS样式/标题修改/选中行号等

源码修改

因为新添加的标题勾选,按钮,右键菜单这些功能改动不大,
不需要动QtTreePropertyBrowser控件的关键代码,只需要简单修改几行就可以了。

Qss样式支持 修改

  • QComboBox 支持qss修改项行高

修改qteditorfactory.cpp 文件 1919行
添加 editor->setView(new QListView());
如图示:
在这里插入图片描述让多选项的行高能够修改
QSS:QComboBox QAbstractItemView::item{height:30px;}

  • 修改QtTreePropertyBrowser控件的每行高度

QtTreePropertyBrowser控件默认是不支持设置行高的,即使我通过修改内部变量的QTreeWidget控件修改行高,也不支持。因为内置的QtPropertyEditorDelegate 委托阻止了设置行高。
修改 qttreepropertybrowser.cpp文件 382行
修改 sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const函数

QSize QtPropertyEditorDelegate::sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const
{//add to 2025-04-17 为了获取qss的heigth高度兼容// 获取 QTreeView 的样式表QTreeView *treeView = qobject_cast<QTreeView*>(parent());if (!treeView) {return QItemDelegate::sizeHint(option, index) + QSize(3,4); // 默认大小}// 获取样式表中的高度QStyleOptionViewItem opt = option;// 从样式中获取大小QSize size = treeView->style()->sizeFromContents(QStyle::CT_ItemViewItem, &opt, QSize(), treeView);return size;
}

如图示:
在这里插入图片描述
QSS:QTreeWidget::item{ background: #1d1f20; height:30px; }

修改控件

  • 添加标题允许勾选,添加设置按钮

添加标题勾选本质上是启用QTreeWidgetItem类的setCheckState方法,并且监控itemChanged(QTreeWidgetItem* ,int )事件响应,
添加按钮是在QTreeWidgetItem添加一个QPushButton按钮

修改源码:

  1. 修改qtpropertybrowser.cpp文件,修改QtPropertyPrivate 私有类
class QtPropertyPrivate
{
public:QtPropertyPrivate(QtAbstractPropertyManager *manager) : m_enabled(true), m_modified(false),m_ischecked(Qt::PartiallyChecked),m_ispushbutton(false), m_manager(manager) {}QtProperty *q_ptr;QSet<QtProperty *> m_parentItems;QList<QtProperty *> m_subItems;QString m_valueToolTip;QString m_descriptionToolTip;QString m_statusTip;QString m_whatsThis;QString m_name;bool m_enabled;bool m_modified;//! 是否可选Qt::CheckState m_ischecked;//! 是否作为一个按钮bool m_ispushbutton;QtAbstractPropertyManager * const m_manager;
};
  1. 修改 qtpropertybrowser.h文件,修改QtProperty类,添加修改属性方法
//追加属性
//! 因为使用的是 QTreeWidgetItem 的勾选事件,修改此属性不会触发信号
//!Qt::CheckState isChecked() const;
//!void setChecked(Qt::CheckState checked);
//! 设置作为一个button按钮 -后面的按钮使用
//!bool isPushbutton() const;
//!void SetPushbutton();Qt::CheckState QtProperty::isChecked() const
{return  d_ptr->m_ischecked;
}
void QtProperty::setChecked(Qt::CheckState checked)
{d_ptr->m_ischecked=checked;//propertyChanged();
}bool QtProperty::isPushbutton() const
{return  d_ptr->m_ispushbutton;
}
void QtProperty::SetPushbutton()
{d_ptr->m_ispushbutton=true;//propertyChanged();
}

在这里插入图片描述

  1. 修改qttreepropertybrowser.cpp文件 563行 修改QtTreePropertyBrowserPrivate类中的propertyInserted方法用于启用勾选,并根据状态判断是否插入按钮
void QtTreePropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
{//! 因为绑定了item修改事件 所以刚开始时禁止信号传递m_treeWidget->blockSignals(true);QTreeWidgetItem *afterItem = m_indexToItem.value(afterIndex);QTreeWidgetItem *parentItem = m_indexToItem.value(index->parent());QTreeWidgetItem *newItem = 0;if (parentItem) {newItem = new QTreeWidgetItem(parentItem, afterItem);} else {newItem = new QTreeWidgetItem(m_treeWidget, afterItem);}//add 是否启用勾选if(index->property()->isChecked()!=Qt::PartiallyChecked){Qt::CheckState checkstate=index->property()->isChecked();newItem->setCheckState(0,checkstate);}m_itemToIndex[newItem] = index;m_indexToItem[index] = newItem;newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);newItem->setExpanded(true);updateItem(newItem);//add pushbutton 插入一个按钮if(index->property()->isPushbutton()){newItem->setText(0,"");QPushButton* pubtton=new QPushButton();const QString descriptionToolTip  = index->property()->descriptionToolTip();const QString propertyName = index->property()->propertyName();pubtton->setToolTip(descriptionToolTip.isEmpty() ? propertyName : descriptionToolTip);pubtton->setStatusTip(index->property()->statusTip());pubtton->setWhatsThis(index->property()->whatsThis());pubtton->setText(propertyName);m_indexToPushButton.insert(pubtton,newItem);//! 绑定 点击信号槽QObject::connect(pubtton,&QPushButton::pressed,[=](){emit q_ptr->itemPressedupdate(m_itemToIndex[m_indexToPushButton[pubtton]]->property());});m_treeWidget->setItemWidget(newItem,1,pubtton);}m_treeWidget->blockSignals(false);
}
  1. 添加绑定itemChanged信号槽,用于监控勾选状态改变
    修改QtTreePropertyBrowser类和QtTreePropertyBrowserPrivate类
//! hpp
//! 追加内容
class QtTreePropertyBrowser : public QtAbstractPropertyBrowser
{Q_SIGNALS://! 选中状态改变void itemCheckStateupdate(QtProperty *item);//! 按钮按下 -某个按钮被按下触发事件void itemPressedupdate(QtProperty *item);
private://! 获取勾选状态改变Q_PRIVATE_SLOT(d_func(), void slotitemChanged(QTreeWidgetItem* item,int col))}//! cpp
class QtTreePropertyBrowserPrivate
{//! 追加修改QtTreePropertyBrowserPrivate类public://! 勾选改变void slotitemChanged(QTreeWidgetItem *item, int column);private://! 创建一个变量 用于保存点击的属性项QMap<QPushButton *, QTreeWidgetItem *> m_indexToPushButton;
}//! init 方法绑定信号
void QtTreePropertyBrowserPrivate::init(QWidget *parent)
{//! 添加-勾选改变状态事件QObject::connect(m_treeWidget, SIGNAL(itemChanged(QTreeWidgetItem* ,int )), q_ptr, SLOT(slotitemChanged(QTreeWidgetItem* ,int )));
}//状态改变发送信号
void QtTreePropertyBrowserPrivate::slotitemChanged(QTreeWidgetItem *item, int column)
{if(column==0){QtBrowserItem *browserItem = m_itemToIndex[item];if(browserItem && !browserItem->property()->hasValue()){if(browserItem->property()->isChecked() != Qt::PartiallyChecked){browserItem->property()->setChecked(item->checkState(column));emit q_ptr->itemCheckStateupdate(browserItem->property());}}}
}
  • 设置修改自定义属性表 表头名称,获取QtTreeWidget控件等
QTreeWidget* QtTreePropertyBrowser::getPropertyTreeWidget()
{return d_ptr->treeWidget();
}//! 修改标题
//! ui->widget_AttriTree->setHeaderLabels(QStringList()<<"属性"<<"业务值");
void QtTreePropertyBrowser::setHeaderLabels(QStringList Headers)
{return d_ptr->m_treeWidget->setHeaderLabels(Headers);
}
  • 根据鼠标坐标 获取选中属性
QtProperty * QtTreePropertyBrowser::getPropertybyPointf(QPoint pos)
{QTreeWidgetItem * item= d_ptr->m_treeWidget->itemAt(QPoint(pos.x(),pos.y()-d_ptr->m_treeWidget->header()->height()));if(item){if(d_ptr->m_itemToIndex[item])return d_ptr->m_itemToIndex[item]->property();else{if(d_ptr->m_itemToIndex[item->parent()])return d_ptr->m_itemToIndex[item->parent()]->property();}}return nullptr;
}

如图示:
在这里插入图片描述

调用示例

  • 绑定编辑工厂和属性节点管理
   //! 属性节点管理//! QtVariantPropertyManager *m_pVarMgrEdit;//! 修改数据类型 工厂//! QtVariantEditorFactory *m_pVarFactory;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m_pVarMgrEdit = new QtVariantPropertyManager(ui->widget_AttriTree);//关联factory,属性可以修改m_pVarFactory = new QtVariantEditorFactory(ui->widget_AttriTree);//connect(m_pVarMgrEdit,&QtVariantPropertyManager::valueChanged,this, &ProPertyWindow::onValueChanged);//绑定信号槽,当值改变的时候会发送信号//! LoadXml();//! qDebug()<<"XML 文件解析完毕! ! ! ";//将一个工厂与manger关联起来,即可修改内容。ui->widget_AttriTree->setFactoryForManager(m_pVarMgrEdit,m_pVarFactory);
//    ui->widget_AttriTree->setAlternatingRowColors(false);//! 修改标题ui->widget_AttriTree->setHeaderLabels(QStringList()<<"属性"<<"业务值");//! 默认事件connect(m_pVarMgrEdit,&QtVariantPropertyManager::valueChanged,this,[&](QtProperty *property, const QVariant &value){qDebug()<<"propertyName: "<< property->propertyName()<<" value: "<<value;});//! 勾选状态改变connect(ui->widget_AttriTree,&QtTreePropertyBrowser::itemCheckStateupdate,this,[&](QtProperty *item){});//! 点击事件connect(ui->widget_AttriTree,&QtTreePropertyBrowser::itemPressedupdate,this,[&](QtProperty *item){});
}
  • 绑定数据示例:
//QDomElement xml文件解析
void MainWindow::ParseItem(QDomElement ItemNode,QtVariantProperty *parent)
{if(!ItemNode.hasAttribute("name"))return;QString propertyName=ItemNode.attribute("name").trimmed();QString type=ItemNode.attribute("type","null").toLower().trimmed();QString check=ItemNode.attribute("check","null").toLower().trimmed();QtVariantProperty *item=nullptr;if(type=="float"||type=="double"){item = m_pVarMgrEdit->addProperty(QVariant::Double,propertyName);item->setValue(ItemNode.text().toDouble());}else if(type=="comboxlist"){QStringList enumNames;int CurrentIndex=0;QDomNodeList childnode= ItemNode.childNodes();for(int j=0;j<childnode.count();j++){if (childnode.item(j).isElement()){QDomElement element = childnode.item(j).toElement();if(element.tagName().toLower()=="data"){enumNames<<element.text();if(element.attribute("isSelect","false").toLower()=="true")CurrentIndex=enumNames.count()-1;}}}item = m_pVarMgrEdit->addProperty(QtVariantPropertyManager::enumTypeId(), propertyName);item ->setAttribute(QLatin1String("enumNames"), enumNames);item ->setValue(CurrentIndex);}else if(type=="int"){item = m_pVarMgrEdit->addProperty(QVariant::Int,propertyName);item->setValue(ItemNode.text().toInt());}else if(type=="datetime"){item = m_pVarMgrEdit->addProperty(QVariant::DateTime,propertyName);item->setValue(QDateTime::fromString(ItemNode.text(),"yyyy/MM/dd hh:mm:ss"));}else if(type=="string"){item = m_pVarMgrEdit->addProperty(QVariant::String,propertyName);item->setValue(ItemNode.text());}else if(type=="pointf"){item = m_pVarMgrEdit->addProperty(QVariant::PointF,propertyName);QStringList poinfs=ItemNode.text().split(',');item->setValue(QPointF(poinfs[0].toDouble(),poinfs[1].toDouble()));}else if(type=="rectf"){item = m_pVarMgrEdit->addProperty(QVariant::RectF,propertyName);QStringList poinfs=ItemNode.text().split(',');item->setValue(QRectF(poinfs[0].toDouble(),poinfs[1].toDouble(),poinfs[2].toDouble(),poinfs[3].toDouble()));}else if(type=="bool"){item = m_pVarMgrEdit->addProperty(QVariant::Bool,propertyName);item->setValue(ItemNode.text()=="false"?false:true);}else if(type=="color"){item = m_pVarMgrEdit->addProperty(QVariant::Color,propertyName);item->setValue(QColor(ItemNode.text()));}else if(type=="pushbutton"){//! 添加按钮事件item = m_pVarMgrEdit->addProperty(QtVariantPropertyManager::groupTypeId(),propertyName);item->SetPushbutton();}elseitem = m_pVarMgrEdit->addProperty(QtVariantPropertyManager::groupTypeId(),propertyName);if(_ISNULL_(item))return;//! 添加首项勾选if(check!="null"){
//        qDebug()<<"propertyName: "<<propertyName<<" check: "<<check;item->setChecked(check.toLower().trimmed()=="true"?Qt::Checked:Qt::Unchecked);}if(!_ISNULL_(parent))parent->addSubProperty(item);elseui->widget_AttriTree->addProperty(item);}

相关文章:

QT控件 修改QtTreePropertyBrowser自定义属性编辑器源码,添加第一列标题勾选,按钮,右键菜单事件等功能

头阵子遇到一个需要修改QtTreePropertyBrowser控件的需求&#xff0c;QT开发做这么久了&#xff0c;这个控件倒是第一次用&#xff0c;费了点时间研究&#xff0c;在这里做个简单的总结。 QtTreePropertyBrowser控件 是 Qt 解决方案 (Qt Solutions) 中的一个组件&#xff0c;用…...

Excel 日期值转换问题解析

目录 问题原因 解决方案 方法1&#xff1a;使用 DateTime.FromOADate 转换 方法2&#xff1a;处理可能为字符串的情况 方法3&#xff1a;使用 ExcelDataReader 时的处理 额外提示 当你在 Excel 单元格中看到 2024/12/1&#xff0c;但 C# 读取到 45627 时&#xff0c;这是…...

0. 七小时挑战:自研企业级任务调度器--前言

在软件开发的世界里&#xff0c;有一个亘古不变的问题&#xff1a;“为什么不直接用现成的&#xff1f;”这句话听起来合理、理性、务实&#xff0c;甚至有点老道。毕竟&#xff0c;时间宝贵、预算有限&#xff0c;轮子已经造好了&#xff0c;何必再动手&#xff1f; 但有时候…...

Spring 核心注解深度解析:@Autowired、@Repository 与它们的协作关系

引言 在 Spring 框架中&#xff0c;​依赖注入&#xff08;DI&#xff09;​​ 是实现松耦合架构的核心机制。Autowired 和 Repository 作为两个高频使用的注解&#xff0c;分别承担着 ​依赖装配​ 和 ​数据访问层标识​ 的关键职责。本文将深入探讨它们的功能特性、协作模式…...

开源模型应用落地-模型上下文协议(MCP)-从数据孤岛到万物互联(一)

一、前言 当开发者还在为每个AI工具编写臃肿的API适配器时&#xff0c;一场关于「连接」的技术革命已悄然降临。模型上下文协议&#xff08;MCP&#xff09;正在用一套全新的交互语法&#xff0c;重新定义人工智能与物理世界的对话方式。MCP协议如同为AI系统装上了“万能接口”…...

基于YOLO的半自动化标注方法:提升铁路视频缺陷检测效率

论文地址:https://arxiv.org/pdf/2504.01010 1. 论文结构概述 本文提出了一种半自动化标注方法,旨在解决铁路缺陷检测中大规模图像/视频数据集标注成本高、耗时长的问题。论文结构清晰,分为以下核心部分: ​引言(Introduction)​ 强调传统手动标注的痛点(耗时、易错、…...

Spring Boot 国际化配置项详解

Spring Boot 国际化配置项详解 1. 核心配置项分类 将配置项分为以下类别&#xff0c;便于快速定位&#xff1a; 1.1 消息源配置&#xff08;MessageSource 相关&#xff09; 控制属性文件的加载、编码、缓存等行为。 配置项作用默认值示例说明spring.messages.basename指定属…...

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据&#xff08;一&#xff09;中&#xff0c;介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识&#xff0c;本文通过分析具体合约代码进行…...

[ctfshow web入门] web23

前置知识 include&#xff1a;包含一个文件&#xff0c;也可以包含一些其他东西&#xff0c;后续用到再解析 substr&#xff1a;对字符串进行切片&#xff0c;第一个参数是字符串&#xff0c;第二第三个参数出从第a个索引开始切n个&#xff0c;索引从0开始计数。 例如&#xf…...

mac 苍穹外卖 后端初始 SkyApplication 报错

报错内容 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid deepseek 解决 打开 File > Project Structure > Project SDK, 选择 JDK17。我没有 JDK17就下载了一…...

CSS中的inline-flex与flex的区别

在CSS中&#xff0c;flex 和 inline-flex 都是用于实现弹性布局&#xff08;Flexbox&#xff09;的显示属性&#xff0c;但它们在布局行为上有所不同。 flex 属性会使元素表现为块级弹性容器&#xff0c;这意味着元素会在页面上占据一整行的空间&#xff0c;无论其内部内容的大…...

不用第三方库调用DeepSeek

又双叒叕很久不写博客&#xff0c;今天吐一口老曹。 一、为啥干这个 之前在修改OJ的时候&#xff0c;本着少修改多收益的原则&#xff0c;用Python写了一些DeepSeek的调用&#xff0c;真的很简单&#xff0c;用拉下来OpenAI按照官方文档复制粘贴就可以。接口文档页面&#xff…...

Proximal Policy Optimization (PPO)

2.1 策略梯度方法 策略梯度方法计算策略梯度的估计值并将其插入到随机梯度上升算法中。最常用的梯度估计器的形式如下&#xff1a; g ^ E t [ ∇ θ log ⁡ π θ ( a t ∣ s t ) A ^ t ] (1) \hat{g} \mathbb{E}_t \left[ \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \h…...

微信小程序:动态表格实现,表头单元格数据完全从data中获取,宽度自定义,自定义文本框,行勾选,样式效果,横向滚动表格(解决背景色不足的问题)等

一、样式效果 二、代码 1、wxml <view class"line flex flex-center"><view class"none" wx:if"{{info.length 0}}">暂无料号</view><view wx:else class"table-container"><!-- 动态生成表头 -->&…...

Java基础编程练习第38题-除法器

题目&#xff1a;编写一个除法器&#xff0c;输入被除数和除数&#xff0c;并将结果输出。 这道题看似很简单&#xff0c;实则也不难。 就是假如用户输入的类型不同怎么办呢&#xff1f;用户输入int或者double类型应该怎么解决。这里我们就需要用到函数的重载。 代码如下&am…...

fabric.js基础使用

1.正方形 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Fabric.js Watermark Example</tit…...

python-Leetcode 65.搜索旋转排序数组

题目&#xff1a; 整数数组nums按升序排列&#xff0c;数组中的值互不相同 在传递给函数之前&#xff0c;nums在预先未知的某个小标K上进行了旋转&#xff0c;使数组变为[nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]&#xff0c;小标从0开始计数。…...

质数质数筛

1.试除法判定质数–O(sqrt(N)) bool is_prime(int x) {if (x < 2) return false;for (int i 2; i < x / i; i )if (x % i 0)return false;return true; }2.试除法分解质因数–O(logN)~O(sqrt(N)) void divide(int x) {for (int i 2; i < x / i; i )if (x % i …...

Django学习记录-1

Django学习记录-1 虽然网上教程都很多&#xff0c;但是感觉自己记录一下才属于自己&#xff0c;之后想找也方面一点&#xff0c;文采不佳看的不爽可绕道。 参考贴 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍&#xff…...

K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority

前言 在Kubernetes环境中使用自签名证书的私有Harbor镜像仓库时&#xff0c;常会遇到证书验证失败的问题。本文将详细讲解如何解决这个常见的证书问题。 环境信息&#xff1a; Kubernetes版本&#xff1a;1.28.2容器运行时&#xff1a;containerd 1.6.20私有仓库&#xff1a…...

使用python访问mindie部署的vl多模态模型

说明 今天使用mindie1.0部署了qwen2_7b_vl模型&#xff0c;测试过程出现一些问题&#xff0c;这里总结下。 问题1&#xff1a;transformers版本太低 报错信息&#xff1a; [ERROR] [model_deploy_config.cpp:159] Failed to get vocab size from tokenizer wrapper with ex…...

LabVIEW 长期项目开发

LabVIEW 凭借其图形化编程的独特优势&#xff0c;在工业自动化、测试测量等领域得到了广泛应用。对于长期运行、持续迭代的 LabVIEW 项目而言&#xff0c;其开发过程涵盖架构设计、代码管理、性能优化等多个关键环节&#xff0c;每个环节都对项目的成功起着至关重要的作用。下面…...

MongoDB 的详细介绍

以下是 MongoDB 的详细介绍,涵盖核心概念、使用场景、优势与操作示例: 一、MongoDB 简介 MongoDB 是一个开源的 文档型 NoSQL 数据库,采用灵活的 JSON-like(BSON)格式存储数据,适合处理非结构化或半结构化数据。 核心特点: Schema-free:无需预定义表结构,字段可动态扩…...

Ubuntu 22.04 AI大模型环境配置及常用工具安装

一、基础环境准备 1.1 系统准备 建议使用 Ubuntu22.04 以下配置皆以 Ubuntu22.04 系统版本为例 1.2 安装git apt-get update && apt-get install git -y1.3 安装 Python 3.9 【建议安装 3.10】&#xff08;安装miniconda或者conda来管理虚拟环境&#xff09; wget …...

蓝桥杯真题——好数、R格式

目录 蓝桥杯2024年第十五届省赛真题-好数 【模拟题】 题目描述 输入格式 输出格式 样例输入 样例输出 提示 代码1&#xff1a;有两个案例过不了&#xff0c;超时 蓝桥杯2024年第十五届省赛真题-R 格式 【vector容器的使用】 题目描述 输入格式 输出格式 样例输入…...

AWS S3深度剖析:云存储的瑞士军刀

1. 引言 在当今数据驱动的世界中,高效、可靠、安全的数据存储解决方案至关重要。Amazon Simple Storage Service (S3)作为AWS生态系统中的核心服务之一,为企业和开发者提供了一个强大而灵活的对象存储平台。本文将全面解析S3的核心特性,帮助读者深入理解如何充分利用这一&q…...

Qt基础:右键菜单

右键菜单 1. 基于鼠标事件实现1.1 原理1.2 操作 2. 基于窗口的菜单策略实现2.1 Qt::DefaultContextMenu2.2 Qt::ActionsContextMenu 2.3 Qt::CustomContextMenu 显示右键菜单, 其处理方式大体上有两种&#xff1a; 基于鼠标事件实现&#xff1b;基于窗口的菜单策略实现。 1. …...

Json快速入门

引言 Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化&#xff0c;它实现了将多个数据对象组织成 为Json格式字符串&#xff0c;以及将 Json 格式字符串解析得到多个数据对象的功能&#xff0c;独立于开发语言。 Json数据对象 Json数据对象类的表示&#xff1a; …...

WinForm真入门(10)——CheckBox控件详解

在 WinForm 中&#xff0c;CheckBox 控件是一个用于表示布尔状态&#xff08;选中/未选中&#xff09;的核心组件。它广泛应用于配置选项、表单提交、条件筛选等场景。以下是 ‌CheckBox 的详细解析‌&#xff0c;涵盖属性、事件、使用技巧和实际案例。 一、CheckBox 核心属性…...

网络安全应急响应-系统排查

在网络安全应急响应中&#xff0c;系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南&#xff0c;涵盖常用命令及注意事项&#xff1a; 一、Windows系统排查 1. 系统信息工具&#xff08;msinfo32.exe&#xff09; 命令执行&#x…...