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

基于 Qt4 的图片处理工具开发(二):增加对比度调节、界面布局优化、多线程操作

废话不多说,先来看一下最终的界面效果

一、引言

在上一篇博客中,我们完成了图片处理工具的基础框架,实现了拖拽加载、亮度调节和角度旋转功能。本文将聚焦界面布局重构对比度调节功能扩展以及多线程性能优化,进一步提升工具的实用性和用户体验。所有界面元素均通过手动代码布局实现,展现 Qt 框架在复杂交互场景下的灵活性。

二、界面布局重构:从垂直布局到左右分栏的交互升级

1. 左右分栏架构设计

采用QDockWidget实现主界面的左右布局:

  • 左侧控制区:包含亮度、对比度、角度调节控件,使用QGroupBox分组管理,提升功能可读性
  • 右侧预览区:嵌入QScrollArea实现图片滚动浏览,支持大尺寸图片显示
// MainWindow.cpp 初始化界面
void MainWindow::initUI() {// 右侧图片预览区(带滚动条)previewWidget = new QWidget(this);QVBoxLayout *previewLayout = new QVBoxLayout(previewWidget);imageLabel = new QLabel(this);imageLabel->setAlignment(Qt::AlignCenter);QScrollArea *scrollArea = new QScrollArea(this);scrollArea->setWidget(imageLabel);scrollArea->setWidgetResizable(true); // 图片自适应滚动区域previewLayout->addWidget(scrollArea);// 左侧控制区(使用QDockWidget实现可停靠面板)m_effectsWidget = new EffectsWidget(this);QDockWidget *dockWidget = new QDockWidget(tr("图片处理"), this);dockWidget->setWidget(m_effectsWidget);addDockWidget(Qt::LeftDockWidgetArea, dockWidget);dockWidget->setMinimumWidth(200); // 防止控件挤压变形
}

2. 手动布局的优势与实现细节

(1)控件分组与层次结构

// EffectsWidget.cpp 角度调节分组
QGroupBox *angleGroup = new QGroupBox(tr("角度调节"));
QVBoxLayout *angleGroupLayout = new QVBoxLayout;// 按钮行
QHBoxLayout *angleButtonLayout = new QHBoxLayout;
clockwiseButton = new QPushButton(tr("顺时针90°"));
counterClockwiseButton = new QPushButton(tr("逆时针90°"));
angleButtonLayout->addWidget(clockwiseButton);
angleButtonLayout->addWidget(counterClockwiseButton);// 输入与滑块行
QHBoxLayout *angleLayout = new QHBoxLayout;
QLabel *angleLabel = new QLabel(tr("角度"));
angleEdit = new QLineEdit("0");
angleEdit->setMaximumWidth(30); // 限制输入框宽度保持布局整齐
angleSlider = new QSlider(Qt::Horizontal);
angleSlider->setRange(0, 360);
angleLayout->addWidget(angleLabel);
angleLayout->addWidget(angleEdit);
angleLayout->addWidget(angleSlider);angleGroupLayout->addLayout(angleButtonLayout);
angleGroupLayout->addLayout(angleLayout);
angleGroup->setLayout(angleGroupLayout);

优势:通过纯代码控制布局参数,精准实现控件对齐、间距和尺寸策略,避免 UI 文件带来的可视化限制。

(2)响应式设计细节

  • 使用QSizePolicy::Preferred和垂直弹簧addStretch()防止界面拉伸变形
  • QSlidersetTickPositionsetTickInterval提升交互体验:
contrastSlider->setTickInterval(10);       // 刻度间隔
contrastSlider->setTickPosition(QSlider::TicksBelow); // 刻度显示在下方

三、新增核心功能:对比度调节的算法实现与交互设计

1. 对比度调节的数学原理

采用经典的对比度调整公式:

// ImageEffectThread.cpp 对比度调整逻辑
if (currentContrast != 0) {double factor = (259.0 * (currentContrast + 255.0)) / (255.0 * (259.0 - currentContrast));for (int y = 0; y < adjustedImage.height(); ++y) {for (int x = 0; x < adjustedImage.width(); ++x) {QColor color = QColor::fromRgba(adjustedImage.pixel(x, y));int red = qBound(0, static_cast<int>(factor * (color.red() - 128) + 128), 255);// 同理处理绿色和蓝色通道color.setRed(red);adjustedImage.setPixel(x, y, color.rgba());}}
}

2. 控件交互与状态同步

(1)双向同步机制

  • 滑块→输入框:滑动结束时同步数值
connect(angleSlider, SIGNAL(sliderReleased()), this, SLOT(syncAngleFromSlider()));
void EffectsWidget::syncAngleFromSlider() {angleEdit->setText(QString::number(angleSlider->value()));
}
  • 输入框→滑块:编辑完成后校验并同步
connect(angleEdit, SIGNAL(editingFinished()), this, SLOT(syncAngleFromEdit()));
void EffectsWidget::syncAngleFromEdit() {int angle = angleEdit->text().toInt();if (angle >= -180 && angle <= 180) { // 限制输入范围angleSlider->setValue(angle);}
}

(2)多模态操作支持

同时提供按钮(90° 步进)、输入框(精确值)、滑块(连续调节)三种调节方式,覆盖不同用户习惯。

最终界面效果如下图所示:

四、多线程优化:耗时操作与 UI 线程的分离

1. 线程架构设计

  • 主线程(UI 线程):处理界面交互、信号槽通信
  • 子线程(ImageEffectThread):执行图片像素处理(亮度 / 对比度调节、角度旋转)
  • 通过信号槽传递QImage数据,避免跨线程直接操作 UI
// ImageEffect.cpp 初始化线程
ImageEffect::ImageEffect(QObject *parent): QObject(parent), currentBrightness(0), currentRotation(0) {imageEffectThread = new ImageEffectThread(this);connect(imageEffectThread, SIGNAL(imageProcessed(const QImage &)),this, SLOT(onImageProcessed(const QImage &)));
}// 启动子线程处理亮度调节
void ImageEffect::adjustBrightness(int value) {if (!originalPixmap.isNull()) {imageEffectThread->setImage(originalPixmap);imageEffectThread->setBrightness(value);imageEffectThread->start(); // 触发子线程run函数}currentBrightness = value;
}

 

2. 子线程实现细节

(1)像素处理逻辑封装

// ImageEffectThread.cpp 核心处理函数
void ImageEffectThread::run() {if (!originalPixmap.isNull()) {QImage image = originalPixmap.toImage();QImage adjustedImage = image.copy();// 亮度调整(复用第一篇博客算法)if (currentBrightness != 0) { /* ... */ }// 对比度调整(新增逻辑)if (currentContrast != 0) { /* ... */ }// 只传递QImage数据,避免在子线程操作QPixmap(UI相关类)emit imageProcessed(adjustedImage); }
}

(2)线程安全措施

  • 使用qBound函数防止像素值溢出(0-255 范围)
  • 避免在子线程中直接操作imageLabel等 UI 控件,仅通过信号传递处理结果

五、代码架构优化:单一职责与模块化设计

1. 核心类职责划分

类名职责描述关键接口
MainWindow主界面管理、文件操作、拖拽处理dragEnterEventdropEvent
EffectsWidget图像处理控件集合brightnessChanged信号、resetControls
ImageEffect业务逻辑核心(加载 / 保存 / 调节)adjustBrightnessadjustContrast
ImageEffectThread子线程像素处理run函数、imageProcessed信号

2. 信号槽通信机制

// MainWindow 连接信号槽
connect(m_effectsWidget, SIGNAL(brightnessChanged(int)), this, SLOT(adjustBrightnessSlot(int)));connect(m_imageEffect, SIGNAL(imageAdjusted()), this, SLOT(onImageAdjusted())); // 处理完成后更新预览// 子线程与主线程通信
void ImageEffect::onImageProcessed(const QImage &image) {QTransform transform;transform.rotate(currentRotation);adjustedPixmap = QPixmap::fromImage(image).transformed(transform);emit imageAdjusted(); // 通知主线程更新界面
}

六、异常处理与用户体验优化

1. 文件操作健壮性

(1)格式校验增强

// MainWindow 拖拽事件处理
void MainWindow::dragEnterEvent(QDragEnterEvent *event) {if (event->mimeData()->hasUrls()) {foreach (const QUrl &url, event->mimeData()->urls()) {QString filePath = url.toLocalFile();if (filePath.endsWith({".png", ".jpg", ".jpeg", ".bmp"}, Qt::CaseInsensitive)) {event->acceptProposedAction();return; // 单个有效文件即可接受拖拽}}}event->ignore();
}

(2)空图片处理

// ImageEffect 加载失败处理
bool ImageEffect::loadImage(const QString& filePath) {QImage img = QImage::fromData(data);if (img.isNull()) {// 通过信号或QMessageBox提示用户(由MainWindow实现)return false;}// ...
}

2. 数值输入保护 

  • 角度输入框限制[-180, 180],自动转换为[0, 360]显示
void EffectsWidget::updateAngleValue(int value) {int normalizedValue = value % 360;if (normalizedValue < 0) normalizedValue += 360; // 负数转正angleEdit->setText(QString::number(normalizedValue));
}

通过本文的优化,工具已具备更专业的界面交互、更健壮的性能表现和可扩展的架构设计。手动布局的灵活性与多线程技术的结合,展现了 Qt 框架在桌面应用开发中的强大能力。后续将围绕算法优化和功能扩展持续更新,欢迎关注系列博客获取完整工程代码和实战经验!

相关文章:

基于 Qt4 的图片处理工具开发(二):增加对比度调节、界面布局优化、多线程操作

废话不多说&#xff0c;先来看一下最终的界面效果 一、引言 在上一篇博客中&#xff0c;我们完成了图片处理工具的基础框架&#xff0c;实现了拖拽加载、亮度调节和角度旋转功能。本文将聚焦界面布局重构、对比度调节功能扩展以及多线程性能优化&#xff0c;进一步提升工具的实…...

禁止页面滚动的方法-微信小程序

在微信小程序中&#xff0c;有几种方法可以禁止页面滚动&#xff1a; 一、通过页面配置禁止滚动 在页面的JSON配置文件中设置&#xff0c;此方法完全禁止页面的滚动行为&#xff1a; {"disableScroll": true }二、通过 CSS 样式禁止滚动 在页面的WXSS文件中添加&…...

基于landsat与Modis影像的遥感技术的生态环境质量评价

本次将结合ArcGIS与ENVI&#xff0c;发布 landsat与Modis影像的遥感技术的生态环境质量评价技术专题&#xff0c;专题课程学习&#xff01; 在反映生态质量的诸多自然因素中&#xff0c;绿度、湿度、热度、干度可谓是与人类生存息息相关的4个重要指标&#xff0c;也是人类直观…...

蓝桥杯刷题--宝石组合

在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状&#xff0c;但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个…...

记录一下学习docker的命令(不断补充中)

#2025-04-10,22:12############### 在wsl2中安装了ubuntu24.04.1后有部署了docker&#xff0c; 如果没有启动docker可以通过下列命令启动docker&#xff1a; sudo systemctl start docker 执行下列命令可以看到docker状态&#xff0c;并不占用控制台的命令&#xff1a; su…...

沃伦森电机状态传感器RS-MTS01:智能运维的解决方案

行业工况背景 一、方案背景 在现代工业生产中&#xff0c;电机发挥着至关重要的作用&#xff0c;其运行状况直接关联到生产效率、产品质量以及成本控制。传统的电机维护主要依赖于定期的巡检和事后维修&#xff0c;这种方式难以提前发现潜在的故障隐患&#xff0c;容易导致意外…...

设计模式:单例模式

复习一下&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09; 原理&#xff1a; 单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。它通过将类的构造函数设为私有&#xff0c;防止外部代码直接实例化该类。同时&#xff0c;提供…...

电商素材革命:影刀RPA魔法指令3.0驱动批量去水印,实现秒级素材净化

本文 去除水印实操视频展示电商图片水印处理的困境​影刀 RPA 魔法指令 3.0 强势登场​利用魔法指令3.0两步实现去除水印操作关于影刀RPA 去除水印实操视频展示 我们这里选择了4张小红书里面比较帅气的图片&#xff0c;但凡用过小红书的都知道&#xff0c;小红书右下角是会有小…...

解析 WebSocket 协议的基本原理

随着互联网的快速发展&#xff0c;Web 应用对实时通信的需求越来越高。传统的 HTTP 协议无法满足实时性的要求&#xff0c;而 WebSocket 协议则应运而生。WebSocket 是一种新型的协议&#xff0c;允许在一个单独的持久连接上进行全双工的通信&#xff0c;提供了更高效、实时的数…...

学生管理系统(Python)

运行结果&#xff1a; 源代码&#xff1a; """ 项目&#xff1a;类似于学生管理系统---增删改查 """ #封装一个学生类 import random class Student: def __init__(self,stuid,name,score): self.stuid stuid self.name name self.score …...

Java抽象类:深入理解与应用

一、引言 在Java的面向对象编程中&#xff0c;抽象类&#xff08;Abstract Class&#xff09;是一个非常重要的概念。它允许我们定义一个类&#xff0c;该类中包含一些抽象方法和非抽象方法&#xff0c;但自己不能被实例化。抽象类主要用于创建类的层次结构&#xff0c;并为子…...

下垂控制的定义与应用解析

下垂控制&#xff08;Droop Control&#xff09;是一种广泛应用于微电网、逆变器及分布式电源系统的控制策略&#xff0c;其核心思想是通过模拟传统同步发电机的下垂特性&#xff0c;实现电力系统中电压、频率的稳定以及功率的合理分配。以下是其关键解释及参考依据&#xff1a…...

oracle 并行度(Parallel Degree)

在Oracle数据库中&#xff0c;并行度&#xff08;Parallel Degree&#xff09; 是用于控制并行处理任务的关键配置&#xff0c;旨在通过多进程协作加速大规模数据处 一、并行度的核心概念 并行度&#xff08;DOP, Degree of Parallelism&#xff09; 表示一个操作同时使用的并…...

轻量级碎片化笔记memos本地NAS部署与跨平台跨网络同步笔记实战

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 推荐 ​ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 前言…...

心有猛虎,细嗅蔷薇

2025年4月10日&#xff0c;13~28℃&#xff0c;还好 待办&#xff1a; 融智云考平台《物理》《物理2》《地理》《地理1》重修试卷 冶金《物理》课程标准 教学技能大赛PPT教案 遇见&#xff1a;网友过得挺好的。 感受&#xff1a;和网友说话还是不错的。 反思&#xff1a;无。 …...

借助DeepSeek开启学术写作高效通道

摘要 在学术研究领域&#xff0c;撰写高质量论文是研究者成果展示与学术交流的关键环节。然而&#xff0c;传统论文写作过程复杂&#xff0c;常使研究者面临诸多挑战。随着人工智能技术的发展&#xff0c;DeepSeek等工具为论文写作带来新契机。本文深入剖析利用DeepSeek进行论文…...

interrupt子系统中的数据结构

我们接着上一篇&#xff0c;开始真正的interrupt子系统&#xff1a; 现在有一个共享的中断&#xff0c;网卡跟开关共享同一个gpio中断&#xff0c;然后当触发中断的时候&#xff0c;GIC会发信号给CPU&#xff0c;告诉他已经发生了中断了&#xff0c;然后CPU会去读取GIC里面的寄…...

本地浏览器运行服务器jupyter文件

之前不知道要设置密码 一直登不上 远程linux服务器中安装jupyter通过本地浏览器访问使用_服务器jupyter 本地浏览器访问-CSDN博客...

P1331 洛谷 海战

题目描述 思路 这个题需要读懂题意&#xff0c;即“什么样的形式表示两只船相撞&#xff1f;” ----> 上下相邻或左右相邻 如果图是不和法的&#xff0c;一定存在如下结构&#xff1a; # # . # 或 # # # . 或 # . # # 或 . # # #即四个格子里有三个#&#xff0c;一个"…...

如何开发iOS辅助工具?iOS按键精灵帮你实现

强大的辅助工具可以支持自动化操作&#xff0c;轻松实现一键点击、滑动、输入等操作&#xff0c;无论是游戏挂机、日常任务还是批量处理&#xff0c;都能高效完成。 在按键精灵中针对新手用户和资深开发作者都有路径实现游戏的任务点击。 新手用户推荐使用录制功能以及连点器…...

数据可视化 —— 柱形图应用(大全)

一、案例一&#xff1a;单柱形图 1.导入库 import matplotlib.pyplot as plt import pandas as pd import numpy as np 2.给窗口名称和画布大小 plt.figure(num单柱形图, figsize(6, 4), facecolorw) 3.定义x、y轴的数据 # range(0-4) x np.arange(5) # 创建数组 y1 np.a…...

NLP高频面试题(三十九)——什么是大模型的涌现能力?

在人工智能领域,随着模型规模的扩大,研究人员观察到大型语言模型会展现出一些在小型模型中未曾出现的全新能力,这种现象被称为涌现能力。这些能力并非通过特定编程或训练目标直接获得,而是在模型参数和训练数据达到一定规模后自发出现的。 为什么会产生涌现能力? 涌现能…...

课程发布|ROS+PX4固定翼无人机仿真开发课程

课程链接&#xff08;限时优惠&#xff09;&#xff1a; ROSPX4固定翼无人机仿真开发课程https://www.bilibili.com/cheese/play/ss131501135...

使用 VcXsrv 在 Windows 10 上运行 Ubuntu 图形界面

VcXsrv 是一款用于 Windows 的开源 X 服务器&#xff0c;它允许在 Windows 系统上显示 Linux 的图形应用程序。当在 Windows 10 上安装并正确配置 VcXsrv 后&#xff0c;通过设置 WSL2 中的DISPLAY环境变量&#xff0c;使其指向运行 VcXsrv 的 Windows 主机的 IP 地址&#xff…...

Java中的参数是值传递还是引用传递?

在java中&#xff0c; 参数传递只有值传递 ,不论是基本类型还是引用类型。 其中的区别在于&#xff1a; 基本数据类型&#xff08;如byte&#xff0c;short&#xff0c;int等&#xff09;&#xff1a;传递的参数是值的副本&#xff0c;即基本类型的数值本身。因此在方法中&am…...

SD教程|AI绘画软件Stable Diffusion的Lora模型详解与使用教程

一、引言 在[AI绘画 领域&#xff0c;StableDiffusion作为一种强大的文本到图像的生成模型&#xff0c;已经吸引了众多艺术家和爱好者的关注。而Lora&#xff08;Low-RankAdaptation&#xff09;模型作为StableDiffusion的一个重要扩展&#xff0c;进一步提升了模型的微调效率…...

矢量网络分析仪测试S参数注意事项

正式测试S参数之前一定要先校准 测量1个端口时&#xff0c;校准步骤如下&#xff1a; 开路&#xff08;Open&#xff09;&#xff1b; 短路&#xff08;Short&#xff09;&#xff1b; 负载&#xff08;Load&#xff09;。 测试2个端口时&#xff0c;校准步骤如下&#xff1a; …...

模拟-与-现实协同训练:基于视觉机器人操控的简单方法

25年3月来自 UT Austin、Nvidia、UC Berkeley 和纽约大学的论文“Sim-and-Real Co-Training: A Simple Recipe for Vision-Based Robotic Manipulation”。 大型现实世界机器人数据集在训练通才机器人模型方面拥有巨大潜力&#xff0c;但扩展现实世界人类数据收集既耗时又耗资…...

期权与期货的在险价值

在险价值&#xff08;Value at Risk&#xff0c;VaR&#xff09; 在险价值&#xff08;Value at Risk&#xff0c;VaR&#xff09;是指在一定概率水平 α % \alpha\% α%&#xff08;置信水平&#xff09;下&#xff0c;某金融资产或资产组合的价值在未来特定时期&#xff08…...

消防设施操作员证书用途有哪些

消防设施操作员证书是国家职业资格证书之一&#xff0c;持有该证书表明具备从事消防设施操作、监控、维护等工作的专业资格。其具体用途和重要性如下&#xff1a; 一、主要用途 就业准入资格 根据《消防法》及相关规定&#xff0c;从事消防控制室值班、消防设施操作与维护等…...

【C++ 内存管理】静态分配和动态分配

文章目录 1.静态分配2.动态分配3.对静态分配和动态分配理解4.析构函数调用顺序5.new[ ] 为什么会多申请内存呢&#xff1f; 1.静态分配 定义&#xff1a; 在编译阶段确定内存大小和生命周期&#xff0c;由编译器自动分配和释放。 特点&#xff1a; ①分配时机&#xff1a;程序…...

基于autokeras的简单天气预报例子和运行输出

import numpy as np from autokeras import StructuredDataClassifier from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 模拟数据 np.random.seed(0) n_samples 1000 X np.random.rand(n_samples, 3…...

云服务器的入门了解

首先&#xff0c;用户可能对云计算和云服务器的基本概念不太清楚&#xff0c;需要先做一个简单易懂的定义&#xff0c;避免使用太多技术术语。接下来&#xff0c;要说明云服务器和传统物理服务器的区别&#xff0c;强调云服务器的优势&#xff0c;比如弹性扩展、按需付费等。 然…...

Navicat连接远程PostGreSQL失败

问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…...

经济金融最优化:从理论到MATLAB实践——最大利润问题全解析

内容摘要 本文聚焦经济金融领域的最大利润问题&#xff0c;深入探讨不考虑销售影响和考虑销售影响两种情形下的利润最大化模型柯布 - 道格拉斯生产函数等理论构建与求解。 关键词&#xff1a;经济金融&#xff1b;最大利润问题&#xff1b;柯布-道格拉斯生产函数 1. 引言 在…...

“AI工业革命2.0”:大语言模型驱动的行业再造浪潮

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从“工具”到“力量”的跃迁 当人工智能步入大模型时代,尤其以ChatGPT、DeepSeek、Grok 等为代表的大语言模型不断刷新人类对智能的认知边界,它们不再只是工具,而是逐步变成了行业逻辑的重构力…...

AI日报 - 2025年4月11日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; 模型突破 | 学术界发布5B模型生成1分钟连贯视频&#xff1b;Pokemon AI达人类水平&#xff1b;Kimi-VL开源&#xff1b;Llama-Nemotron-Ultra 253B发布&#xff1b;Google Gemini长文本处理达200万token。 ▎&#x1f4bc; 商…...

企业安全用电 智能物联网断路器 功能参数介绍

安科瑞刘鸿鹏 摘要 随着城市化和智能化建设的不断推进&#xff0c;现代建筑对用电系统的安全性、可视化管理和智能化控制提出了更高的要求。传统空气开关已无法满足当前电力系统对故障预警、远程控制及能效管理的复杂需求。本文结合安科瑞ASCB2LE125系列物联网漏电断路器的功…...

python:all列表

1.all列表的说明&#xff1a; 当模块中有__all__变量时&#xff0c;当使用from xxx import *时&#xff0c;只能导入这个列表中的元素。 2.具体的例子&#xff1a; 1.先创建一个模块my_mod,在列表__all__中分别写入第一次只写入test1&#xff0c;第二次写入test1、test2两个…...

ctfshow VIP题目限免 js敏感信息泄露

根据题目提示是 js 敏感信息泄露&#xff0c;那我就右键查看源代码看看能不能发现 js 文件 访问这个 js 文件 发现了“玩101分给你flag”的源码&#xff0c;还有一段密文&#xff0c;找个在线网站解密一下&#xff08;解码UTF16成文字转换器在线&#xff09; 这句话的意思是去…...

git 提交空文件夹

git 提交空文件夹 方法1&#xff1a;使用 .gitkeep 文件 touch path/to/empty/folder/.gitkeep git add path/to/empty/folder/.gitkeep git commit -m "Add .gitkeep to track empty folder"...

QT中怎么隐藏或显示最大化、最小化、关闭按钮

文章目录 方法一&#xff1a;通过代码动态设置1、隐藏最大化按钮2、隐藏最小化按钮3、隐藏关闭按钮方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手动控制按钮 4、同时隐藏最大化和最小化按钮5、同时隐藏最大化和关闭按钮6、…...

数据结构与算法-动态规划-线性动态规划,0-1背包,多重背包,完全背包,有依赖的背包,分组背包,背包计数,背包路径

动态规划原理 动态规划这玩意儿&#xff0c;就好比是在拓扑图上玩跳格子游戏。在图论中&#xff0c;咱们是从特定的节点跳到其他节点&#xff1b;而在动态规划里呢&#xff0c;我们是从一个状态 “嗖” 地转移到另一个状态。状态一般用数组来表示&#xff0c;就像 f [i][j]&am…...

前端-Vue2组件化编程

什么是组件 组件的定义-实现应用中局部功能代码和资源的集合 非单文件组件 非单文件组件&#xff1a; 一个文件中包含有n个组件。 单文件组件&#xff1a; 一个文件中只包含有1个组件。 基本使用 介绍 Vue中使用组件的三大步骤&#xff1a; 一、定义组件(创建组件) 二、…...

[leetcode]01背包问题

一.问题描述 01背包问题是一个经典的组合优化问题&#xff0c;属于动态规划算法的典型应用场景。其问题描述如下&#xff1a; 有一个容量为C的背包&#xff0c;以及 n 个物品&#xff0c;每个物品都有重量w[i] 和价值 v[i]。要求在有限的背包容量下选择一些物品放入背包&#…...

洛谷刷题Day1——P1706+P1157+P2089+P3654

目录 1. P1706 全排列问题题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示代码 2. P1157 组合的输出题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 代码 3. P2089 烤鸡题目背景题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示代…...

游戏引擎学习第214天

总结并为当天的任务做好准备 昨天&#xff0c;我们将所有调试控制代码迁移到使用新的调试接口中&#xff0c;但我们没有机会实际启用这些代码。我们做了很多准备工作&#xff0c;比如规划、将其做成宏、并将其放入调试流中&#xff0c;但实际上我们还没有办法进行测试。 今天…...

算法题型讲解

一.双指针 主要分为俩种类型&#xff1a; 1.左右指针&#xff1a;双指针指向开头&#xff0c;以一定标准移动或交换&#xff0c;对区域进行划分&#xff0c;或找到特殊点的位置 &#xff08;如&#xff1a;快慢指针判断有无环&#xff0c;移动零&#xff09; 2.对撞指针&am…...

Qt零散知识点

Qt零散知识点 Qt优点 跨平台接口简单&#xff0c;易上手一定程度上简化了内存的回收 Qt创建新项目 第一个窗口类默认的三个基类 QWidgetQMainWindowQDialog 其中QWidget是QMainWindow和QDialog的基类 一个Qt项目默认创建的文件 main.cpp 入口函数pro文件&#xff1a;工…...

算法导论(递归回溯)——⼆叉树中的深搜

算法思路&#xff08;129&#xff09; 前序遍历遵循“根节点、左子树、右子树”的顺序遍历二叉树的所有节点&#xff0c;常用于解决子节点状态依赖于父节点状态的问题。 算法思路&#xff1a; 在前序遍历的过程中&#xff0c;我们可以将信息从节点向左右子树传递&#xff0c…...