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

多人协同进行qt应用程序开发应该注意什么2?

在多人协同开发Qt应用程序时,为了确保高效协作、代码一致性和项目可维护性,需要特别注意以下关键点:


1. 版本控制与协作流程

  • 统一版本控制工具:使用Git并规范分支策略(如Git Flow),通过.gitignore过滤生成文件(如*.pro.userbuild/)。
  • 处理Qt特殊文件
    • UI文件(.ui):避免多人同时修改同一UI文件,冲突时需手动检查XML结构。
    • 资源文件(.qrc):合并时注意资源路径的添加顺序。
    • 翻译文件(.ts):使用lupdate工具更新后提交,避免直接编辑生成的.ts文件。
  • 提交规范:要求清晰的提交信息(如feat: 添加登录界面),关联任务管理系统(如Jira)。

2. 环境与构建系统

  • 统一开发环境
    • 明确Qt版本(如Qt 6.4.0)、编译器(MSVC2019/gcc)及构建工具(CMake/qmake)。
    • 使用DockerVagrant容器化环境,或通过qtconfig.json记录配置。
  • 构建系统选择
    • 推荐使用CMake(Qt官方主推),或确保.pro文件结构清晰,避免平台相关代码混入。
  • 依赖管理
    • 使用Conanvcpkg管理第三方库,避免手动配置路径。

3. 代码结构与设计规范

  • 模块化设计
    • 将功能拆分为独立库(动态库或静态库),通过QPluginLoader实现插件化。
    • 使用Qt命名规范(如类名大写、信号用onXxx前缀)。
  • 接口设计
    • 模块间通过抽象接口(纯虚类)通信,减少直接依赖。
    • 使用Pimpl模式隐藏实现细节。
  • 代码风格
    • 使用clang-format定义代码格式,通过Git钩子自动检查。
    • 禁用非Qt标准特性(如C++异常、RTTI),保持跨平台一致性。

4. UI设计与资源管理

  • UI文件协作
    • 为复杂界面拆分多个.ui文件,通过QUiLoader动态加载。
    • 自定义控件需统一命名前缀(如CustomButton),并提交到公共控件库。
  • 资源管理
    • 优先使用Qt资源系统(.qrc)嵌入图片等资源,而非绝对路径。
    • 为不同分辨率提供多套资源,通过QFileSelector动态加载。

5. 信号与槽的规范

  • 连接方式
    • 优先使用编译时连接(Qt5+的新式语法):
      connect(sender, &Sender::signal, receiver, &Receiver::slot);
      
    • 避免字符串形式的SIGNAL()/SLOT(),减少运行时错误。
  • 线程安全
    • 跨线程通信使用QueuedConnection,通过QMetaObject::invokeMethod调用。

6. 测试与持续集成

  • 单元测试
    • 使用Qt Test框架,测试用例按模块分组。
    • Mock对象模拟信号触发(如QSignalSpy捕获信号)。
  • 自动化CI/CD
    • 在GitHub Actions/GitLab CI中配置多平台构建(Windows/Linux/macOS)。
    • 集成Coverage工具(如gcov)检查测试覆盖率。

7. 文档与沟通

  • 代码文档
    • 关键类/接口使用Doxygen格式注释,生成API文档。
    • 维护ARCHITECTURE.md描述模块依赖关系。
  • 设计文档
    • 使用PlantUML绘制信号流图、类图,记录在Wiki中。
  • 沟通机制
    • 每日站会同步进度,使用Pull Request(PR)进行代码评审,强制要求至少1人审核。

8. 跨平台兼容性

  • 平台相关代码隔离
    • 使用预处理器宏隔离平台代码(如#ifdef Q_OS_WIN)。
    • 将平台实现封装为独立类(如FileDialogWin/FileDialogLinux)。
  • 定期跨平台测试
    • 在CI中配置多平台构建,使用虚拟机或云服务测试。

9. 国际化(i18n)与本地化

  • 翻译流程
    • 使用Qt Linguist管理.ts文件,禁止手动编辑生成的.qm
    • 通过lrelease自动生成翻译文件,集成到构建流程。
  • 字符串规范
    • 所有用户可见文本用tr()包裹,避免硬编码。

10. 性能与内存管理

  • 对象树管理
    • 利用Qt的父子对象机制自动释放内存(QObject派生类)。
    • 避免在栈上创建QWidget(可能导致崩溃)。
  • 资源释放
    • 显式删除非父子关系的对象(如deleteLater()处理跨线程对象)。

示例:冲突解决策略

# UI文件合并冲突示例(.ui)
<<<<<<< HEAD
<widget class="QPushButton" name="okButton"><property name="geometry"><rect><x>100</x><y>200</y></rect></property>
</widget>
=======
<widget class="QPushButton" name="okButton"><property name="text"><string>Submit</string></property>
</widget>
>>>>>>> feature/new-button-text# 解决方案:手动合并两个属性(geometry和text),确保XML结构正确。

通过以上规范,团队可显著降低协作成本,提升代码质量和交付效率。核心原则是通过工具自动化规范,通过文档减少歧义,通过设计降低耦合


以下是一个针对多人协作的 Qt项目示例,涵盖代码结构、模块化设计、版本控制规范和测试用例,帮助理解实际应用中的协作要点:


1. 项目目录结构示例

MyQtApp/
├── CMakeLists.txt              # 根CMake配置
├── .gitignore                  # 忽略构建文件、IDE配置等
├── README.md                   # 项目说明、构建步骤
├── docs/                       # 设计文档
│   └── ARCHITECTURE.md         # 模块依赖图
├── src/                       
│   ├── core/                  # 核心模块(静态库)
│   │   ├── CMakeLists.txt
│   │   ├── core_global.h      # 导出宏定义
│   │   └── Logger.h           # 日志工具类
│   ├── auth/                  # 认证模块(动态库)
│   │   ├── CMakeLists.txt
│   │   ├── auth_global.h
│   │   ├── AuthService.h      # 认证接口
│   │   └── AuthService_p.h    # Pimpl实现
│   └── main/                  # 主程序
│       ├── CMakeLists.txt
│       ├── MainWindow.ui      # UI文件
│       ├── MainWindow.h
│       └── main.cpp
├── tests/                     # 测试目录
│   ├── CMakeLists.txt
│   └── AuthServiceTest.cpp    # 单元测试
└── third_party/               # 第三方依赖(如用vcpkg管理)

2. 模块化代码示例

核心模块(core/Logger.h)
// core_global.h
#pragma once
#include <QtCore/qglobal.h>
#if defined(CORE_LIBRARY)
#  define CORE_EXPORT Q_DECL_EXPORT
#else
#  define CORE_EXPORT Q_DECL_IMPORT
#endif// Logger.h
#include "core_global.h"
#include <QObject>class CORE_EXPORT Logger : public QObject {Q_OBJECT
public:static Logger& instance();void log(const QString& message);private:Logger() = default;  // 单例模式
};
认证模块(auth/AuthService.h)
// auth_global.h(类似core_global.h)
// AuthService.h
#include "auth_global.h"
#include <QObject>class AUTH_EXPORT AuthService : public QObject {Q_OBJECT
public:explicit AuthService(QObject* parent = nullptr);bool login(const QString& username, const QString& password);signals:void loginSuccess();void loginFailed(const QString& error);
};

3. CMake配置示例

根CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(MyQtApp LANGUAGES CXX)set(CMAKE_AUTOMOC ON)  # 自动处理Qt元对象
set(CMAKE_CXX_STANDARD 17)find_package(Qt6 COMPONENTS Core Widgets REQUIRED)add_subdirectory(src/core)    # 核心模块
add_subdirectory(src/auth)   # 认证模块
add_subdirectory(src/main)   # 主程序
add_subdirectory(tests)       # 测试
认证模块CMakeLists.txt
# src/auth/CMakeLists.txt
set(AUTH_SOURCESAuthService.cppAuthService_p.cpp
)add_library(Auth SHARED ${AUTH_SOURCES})
target_link_libraries(Auth PRIVATE Qt6::Core)
target_include_directories(Auth PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

4. 信号与槽连接示例

// MainWindow.cpp
#include "MainWindow.h"
#include "auth/AuthService.h"MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) {auto* authService = new AuthService(this);connect(authService, &AuthService::loginSuccess, this, &MainWindow::onLoginSuccess);connect(authService, &AuthService::loginFailed, this, &MainWindow::showError);
}void MainWindow::onLoginSuccess() {qDebug() << "Login succeeded!";
}

5. 单元测试示例(Qt Test)

// AuthServiceTest.cpp
#include <QtTest>
#include "auth/AuthService.h"class AuthServiceTest : public QObject {Q_OBJECT
private slots:void testValidLogin() {AuthService auth;QSignalSpy spy(&auth, &AuthService::loginSuccess);auth.login("admin", "123456");QVERIFY(spy.wait(1000));  // 验证信号是否触发}
};QTEST_MAIN(AuthServiceTest)
#include "AuthServiceTest.moc"

6. Git分支策略示例

main        - 仅用于发布稳定版本
develop     - 主开发分支
feature/    - 功能分支(如 feature/user-auth)
hotfix/     - 紧急修复分支

7. 代码风格自动化(.clang-format 示例)

BasedOnStyle: Qt
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AllowShortIfStatementsOnASingleLine: false
BreakBeforeBraces: Allman
IndentWidth: 4
...

关键协作提示

  1. UI文件冲突:若两人同时修改 MainWindow.ui,合并时需手动检查XML结构(如控件属性是否冲突)。
  2. 模块接口:通过 AuthService 暴露抽象接口,隐藏内部实现(如 AuthService_p.h 私有类)。
  3. 依赖隔离:使用 find_packagetarget_link_libraries 明确模块依赖关系。

以下是将 vcpkg 替换为 Conan 的完整项目结构示例,适配您的 MyQtApp 目录布局,并保留模块化设计:


调整后的项目结构

MyQtApp/
├── CMakeLists.txt              # 根CMake配置
├── conanfile.txt               # Conan依赖声明(新增)
├── .gitignore                  # 新增忽略Conan缓存目录
├── README.md                   # 更新构建步骤
├── docs/
│   └── ARCHITECTURE.md        
├── src/                       
│   ├── core/                 
│   │   ├── CMakeLists.txt     # 更新为Conan依赖集成
│   │   ├── core_global.h      
│   │   └── Logger.h          
│   ├── auth/                 
│   │   ├── CMakeLists.txt     # 更新动态库配置
│   │   ├── auth_global.h     
│   │   ├── AuthService.h     
│   │   └── AuthService_p.h   
│   └── main/                 
│       ├── CMakeLists.txt     # 主程序依赖配置
│       ├── MainWindow.ui      
│       ├── MainWindow.h      
│       └── main.cpp          
├── tests/                     
│   ├── CMakeLists.txt         # 测试依赖配置
│   └── AuthServiceTest.cpp    
└──                          # 移除third_party目录(由Conan管理依赖)

关键文件配置示例

1. 根目录 CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(MyQtApp LANGUAGES CXX)# 包含Conan生成的工具链文件(需先运行conan install)
include(${CMAKE_BINARY_DIR}/generators/conan_toolchain.cmake)# 设置Qt版本和组件
set(QT_VERSION 6.5.0)
set(QT_COMPONENTS Core Gui Widgets)# 添加子目录
add_subdirectory(src/core)
add_subdirectory(src/auth)
add_subdirectory(src/main)
add_subdirectory(tests)
2. conanfile.txt (Conan依赖声明)
[requires]
qt/6.5.0
openssl/3.1.4   # 如果认证模块需要SSL
gtest/1.14.0    # 单元测试依赖[generators]
CMakeDeps
CMakeToolchain[options]
qt:shared=False          # 静态链接Qt
qt:with_vulkan=False     # 禁用不需要的模块
qt:with_sqlite3=True     # 启用SQLite支持[layout]
cmake_layout
3. core模块 CMakeLists.txt
# src/core/CMakeLists.txt
project(Core)# 添加核心库源码
add_library(Core STATICLogger.cppLogger.h
)# 链接Qt和Conan依赖
target_link_libraries(Core PRIVATEQt6::CoreQt6::Gui
)# 导出符号(跨平台兼容)
target_compile_definitions(Core PRIVATE CORE_LIBRARY)
4. auth模块 CMakeLists.txt
# src/auth/CMakeLists.txt
project(Auth)# 添加动态库源码
add_library(Auth SHAREDAuthService.cppAuthService_p.cppAuthService.hAuthService_p.h
)# 链接Qt和OpenSSL
target_link_libraries(Auth PRIVATEQt6::CoreOpenSSL::SSL
)# 设置动态库导出符号
target_compile_definitions(Auth PRIVATE AUTH_LIBRARY)
5. 测试模块 CMakeLists.txt
# tests/CMakeLists.txt
project(Tests)# 添加测试可执行文件
add_executable(AuthServiceTestAuthServiceTest.cpp
)# 链接被测模块和测试框架
target_link_libraries(AuthServiceTest PRIVATEAuthCoreGTest::gtest_main
)# 添加测试用例
enable_testing()
add_test(NAME AuthServiceTest COMMAND AuthServiceTest)

构建流程

1. 安装依赖
# 在项目根目录执行
mkdir build && cd build# 安装依赖并生成CMake工具链文件
conan install .. --build=missing \--settings build_type=Release \--settings compiler.cppstd=17
2. 构建项目
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --parallel
3. 运行测试
ctest --output-on-failure

依赖管理优化技巧

  1. 自定义Conan Profile
    创建 conan/profiles/linux_gcc 文件:

    [settings]
    os=Linux
    arch=x86_64
    compiler=gcc
    compiler.version=11
    compiler.cppstd=17
    build_type=Release
    

    使用方式:

    conan install .. --profile=conan/profiles/linux_gcc
    
  2. 版本锁定文件
    生成版本锁文件避免依赖漂移:

    conan lock create conanfile.txt --lockfile=conan.lock
    
  3. 私有包管理
    conanfile.txt 中添加私有仓库:

    [remote]
    my-repo https://my-conan-server.com
    

与原有结构的差异说明

原结构Conan适配方案
third_party/ 目录完全移除,由Conan管理依赖
手动处理Qt路径通过 find_package(Qt6) 自动定位
vcpkg工具链集成替换为 conan install + CMake集成
平台相关依赖配置通过Conan Profile统一管理

通过这种配置,您的团队可以:

  1. 实现 依赖版本精确控制
  2. 支持 跨平台编译(Windows/Linux/macOS)
  3. 保持 模块化设计 的同时简化依赖管理
  4. 通过 conan.lock 文件确保所有开发者环境一致

相关文章:

多人协同进行qt应用程序开发应该注意什么2?

在多人协同开发Qt应用程序时&#xff0c;为了确保高效协作、代码一致性和项目可维护性&#xff0c;需要特别注意以下关键点&#xff1a; 1. 版本控制与协作流程 统一版本控制工具&#xff1a;使用Git并规范分支策略&#xff08;如Git Flow&#xff09;&#xff0c;通过.gitign…...

js关于for of 与for in

for…of for-of循环用于遍历可迭代对象&#xff0c;如数组、字符串、Map、Set等。它直接访问每个元素的值&#xff0c;而不是键名。 const arr [3,5,6,7,0] for(let item of arr){console.log(item); } // 3 // 5 // 6 // 7 // 0只有部署了Iterator接口的数据结构才能使用fo…...

Python Excel

一、Python读Excel——xlrd -*- coding: utf-8 -*- import xlrddef read_excel():打开文件workbook xlrd.open_workbook(rD:\demo1.xlsx)获取所有sheetprint(workbook.sheet_names()) 列表形式返回sheet1_name workbook.sheet_names()[0]根据sheet索引或者名称获取sheet内容…...

前端全局编程和模块化编程

1. 全局编程 <!DOCTYPE html> <html> <head><title>OpenLayers 示例</title><style>.map {width: 100%;height: 400px;}</style><script src"https://cdn.jsdelivr.net/npm/olv7.4.0/dist/ol.js"></script>&…...

随机2级域名引导页HTML源码

源码介绍 随机2级域名引导页HTML源码,每次点进去都随机一个域名前缀。 修改跳转域名在 350 行代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码免费获取 随机2级域名引导页…...

Latex的各种数学公式

Latex的各种数学公式 简介公式1、 A 、 A ‾ \neg A\text{、}\overline{A} A、A2、 、 \text{、} 、3、 ⋅ 、 ∙ \cdot \text{、} \bullet ⋅、∙ 4、表格 简介 这里会随时更新我需要用到的数学公式&#xff0c;以csdn中写作格式为主&#xff0c;可能过时了&#xff0c;不适合…...

稻壳模板下载器(Windows):免费获取WPS稻壳模板的利器

稻壳模板下载器&#xff08;Win&#xff09; 稻壳模板下载器是一款功能强大的工具&#xff0c;能够帮助用户免费下载WPS稻壳儿中的各种模板&#xff0c;无需开通VIP会员。它支持多种模板类型&#xff0c;包括PPT、Word、Excel等&#xff0c;极大地提升了用户的办公效率。 依托…...

BeanDefinition和Beanfactory实现一个简单的bean容器

目录 什么是 Springbean 容器 设计思路 图解 参考文章 开源地址 BeanDefinition 类 BeanFactory 类 测试类 什么是 Springbean 容器 Spring 包含并管理应用对象的配置和生命周期&#xff0c;在这个意义上它是一种用于承载对象的容器&#xff0c;你可以配置你的每个 Bea…...

Mybatis的resultMap标签介绍

说明&#xff1a;在Mybatis中&#xff0c;resultMap 标签可以用于SQL查询后的封装数据&#xff0c;本文用两个场景介绍 resultMap 标签的使用。 搭建环境 先搭一个Demo&#xff0c;pom如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> &…...

jarvisoj API调用 [JSON格式变XXE]

http://web.jarvisoj.com:9882/ 题目要求&#xff1a;请设法获得目标机器 /home/ctf/flag.txt 中的flag值 抓包得到&#xff1a; POST /api/v1.0/try HTTP/1.1 Host: web.jarvisoj.com:9882 Content-Length: 36 Accept-Language: zh-CN,zh;q0.9 User-Agent: Mozilla/5.0 (W…...

论坛系统的测试

项目背景 论坛系统采用前后端分离的方式来实现&#xff0c;同时使用数据库 来处理相关的数据&#xff0c;同时将其部署到服务器上。前端主要有7个页面组成&#xff1a;登录页&#xff0c;列表页&#xff0c;论坛详情页&#xff0c;编辑页&#xff0c;个人信息页&#xff0c;我…...

RK3588使用笔记:纯linux系统下基础功能配置(不定期更新)

一、前言 用于记录使用RK3588这个平台在纯linux系统下的一些功能配置&#xff0c;RK3588只是一个芯片&#xff0c;linux只是一个系统&#xff0c;但是linux系统可以运行在无数的芯片上&#xff0c;也都大同小异&#xff0c;本编文章主要记录linux系统环境的一些常用的基础功能…...

yum install 报错(CentOS换源):

yum instally yum utils device mapper persistent-data lvm2 报错&#xff1a; 排查错误原因&#xff1a;centos7 系统停止维护了 解决方案&#xff1a;换源&#xff08;更换操作系统&#xff09; //1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-…...

HTTP常见状态码分析

当浏览者访问一个网页时&#xff0c;浏览者的浏览器会想网页所在的服务器发出请求&#xff0c;当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含 HTTP 状态码的信息头&#xff08;server header&#xff09;用以响应浏览器的请求。 常见的状态码&#xf…...

Python与Web 3.0支付系统:技术融合与未来展望

Python与Web 3.0支付系统:技术融合与未来展望 随着区块链技术的不断发展,Web 3.0支付系统正逐步成为数字经济的重要组成部分。Python作为一种高效、易用的编程语言,在Web 3.0支付系统的开发中扮演着不可或缺的角色。本文将从技术背景、Python的应用、代码示例以及未来发展趋…...

Linux命令-sed指令

sed命令参数&#xff1a; 基本参数 -n&#xff1a;抑制默认输出&#xff0c;只显示匹配的行。 -e&#xff1a;指定 sed 脚本。 -i&#xff1a;直接修改文件内容。 -f&#xff1a;指定包含 sed 脚本的文件。 -r&#xff1a;启用扩展正则表达式。 常用操作 s&#xff1a;替换字符…...

Unbantu24.04配置-软件安装

Ubantu24.04配置—环境安装 ​ 最近在笔记本安装了双系统&#xff0c;这次在这里回顾一下&#xff0c;本章节主要是一些软件的注意点&#xff0c;大多数都是在网上有一定的教程的 1.搜狗输入法 1.1 删除其他框架 sudo apt purge ibus sudo apt remove fcitx5* sudo apt pur…...

八股总结(Java)实时更新!

八股总结&#xff08;java&#xff09; ArrayList和LinkedList有什么区别 ArrayList底层是动态数组&#xff0c;LinkedList底层是双向链表&#xff1b;前者利于随机访问&#xff0c;后者利于头尾插入&#xff1b;前者内存连续分配&#xff0c;后者通过指针连接多块不连续的内存…...

NVIDIA TensorRT 10 [TAR]安装教程

平台信息 操作系统&#xff1a;Ubuntu 20.04.6 LTSCPU架构&#xff1a;x86_64GPU&#xff1a;Tesla T4 x 2驱动信息&#xff1a; NVIDIA-SMI&#xff1a;535.104.05Driver Version: 535.104.05CUDA Version: 12.2 步骤 预备步骤 安装驱动和CUDA 假设已经成功安装好驱动&a…...

深入探索 iOS 卡顿优化

认识卡顿 一些概念 FPS&#xff1a;Frames Per Second&#xff0c;表示每秒渲染的帧数&#xff0c;通过用于衡量画面的流畅度&#xff0c;数值越高则表示画面越流畅。CPU&#xff1a;负责对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码…...

【C/C++算法】从浅到深学习---分治算法之快排思想(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a;本章是针对快速排序进行的优化和再次理解快排思想&#xff0c;将会通过4道题目带你再次…...

精通React JS中的API调用:示例指南

精通React JS中的API调用:示例指南 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 精通React JS中的API调用:示例指南为什么在React JS中进行API调用?在React JS中制作API调用:…...

浅谈Thread类及常见方法与线程的状态(多线程编程篇2)

目录 前言 1.Thread类及常见方法 Thread类中常见的属性 1. getId() 2. getName() 3. getState() 4. getPriority() 5. isDaemon() 6. isAlive() 7. isInterrupted() 2.Thread类中常见的方法 Thread.interrupt() (中断线程) Thread.start()(启动线程) 1. 覆写 run…...

算法刷题记录——LeetCode篇(1.2) [第11~20题](持续更新)

更新时间&#xff1a;2025-03-29 LeetCode题解专栏&#xff1a;实战算法解题 (专栏)技术博客总目录&#xff1a;计算机技术系列目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 17. 电话号码的字母组合 给定一个仅包含数字 2-9…...

基于HTML5和CSS3实现3D旋转相册效果

基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…...

unity中Xcharts图表鼠标悬浮表现异常

鼠标悬浮在面板附近&#xff0c;只显示单独的一个项目 而且无论鼠标如何移动&#xff0c;根本没有效果。 解决方案&#xff1a; 需要在对应的Canvas上绑定主相机才可以 鼠标移动到项目上就有信息展示了...

Unity程序嵌入Qt后点击UI按钮Button没有反应

一、前言 在一次项目中&#xff0c;需要将Unity程序嵌入qt中&#xff0c;并在主界面显示&#xff0c;根据网络资料与相关代码&#xff0c;成功将unity程序嵌入&#xff0c;但是在点击Unity的Button按钮时却没有响应&#xff0c;在查找相关资料后&#xff0c;解决问题&#xff…...

Linux安装Cmake (Centos 7.9)

cmake安装 这个虽然已经更新到了4.0.0版本了&#xff0c;但是我们要用3.5版本的&#xff0c;因为这个比较稳定 官方地址&#xff1a;https://github.com/Kitware/CMake/releases/tag/v3.5.0&#xff0c;选择那个cmake-3.5.0-Linux-x86_64.tar.gz下载&#xff0c; 首先解压文…...

31天Python入门——第14天:异常处理

你好&#xff0c;我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…...

Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题

一、问题 在使用集群服务器前可以查看导入&#xff0c;module load不需要安装。我都是自己重新下载Anaconda3-2024.10-1-Linux-x86_64.sh&#xff0c;然后安装&#xff0c;导致混乱。下面是情况 1.创建的环境名跑到目录下了 2.多个base,且有个base无显示 二、解决办法 1.删…...

【Linux】B站黑马程序视频学习笔记(一)

一、Linux内核与发行版 注意&#xff1a;下图程序指向内核的箭头用的是“调用”&#xff0c;内核指向硬件用的是“调度”。 Linux内核代码下载网站&#xff1a;https://www.kernel.org/ 二、虚拟机-VMware 学习Linux可以借助虚拟机&#xff08;其使用到的CPU、内存、硬盘都是…...

HarmonyOS NEXT——【鸿蒙原生应用加载Web页面】

鸿蒙客户端加载Web页面&#xff1a; 在鸿蒙原生应用中&#xff0c;我们需要使用前端页面做混合开发&#xff0c;方法之一是使用Web组件直接加载前端页面&#xff0c;其中WebView提供了一系列相关的方法适配鸿蒙原生与web之间的使用。 效果 web页面展示&#xff1a; Column()…...

【软件工程】习题及答案

目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1&#xff0e;关于引起软件危机的原因&#xff…...

css选择最后结尾的元素DOM

前言 选中最后一个元素&#xff0c;实际使用非常频繁。 解决方案 使用 CSS 提供的选择器&#xff0c;即可完成。 如下代码示例&#xff0c;两种选择器均可实现。 <p>...</p>p:last-child{ background:#ff0000; }p:nth-last-child(1){background:#ff0000; }p&…...

【AI论文】挑战推理的边界:大型语言模型的数学基准测试

摘要&#xff1a;近年来&#xff0c;大型推理模型的迅猛发展导致现有用于评估数学推理能力的基准测试趋于饱和&#xff0c;这凸显出迫切需要更具挑战性和严谨性的评估框架。为填补这一空白&#xff0c;我们推出了OlymMATH&#xff0c;这是一项全新的奥林匹克级数学基准测试&…...

使用 Python包管理工具 uv 完成 Open WebUI 的安装

uv 是一个极其快速的 Python 包安装器和解析器&#xff0c;用 Rust 编写&#xff0c;旨在作为 pip 和 pip-tools 工作流的替代品 使用 uv 安装&#xff08;推荐&#xff09; macOS/Linux&#xff1a; curl -LsSf https://astral.sh/uv/install.sh | shWindows&#xff1a; po…...

【区块链安全 | 第三篇】主流公链以太坊运行机制

文章目录 1. 以太坊账户类型2. 以太坊网络架构2.1 节点类型2.2 交易流程 3. 共识机制4. Gas 机制4.1 Gas 计算方式4.2 以太坊 EIP-1559 交易机制 5. EVM&#xff08;以太坊虚拟机&#xff09;5.1 EVM 结构5.2 EVM 指令5.3 EVM 运行机制 6. 智能合约7. ERC 代币标准7.1 ERC-207.…...

C# 字符串(String)

C# 字符串&#xff08;String&#xff09; 引言 在C#编程语言中&#xff0c;字符串&#xff08;String&#xff09;是处理文本数据的基础。字符串是字符的有序集合&#xff0c;用于存储和处理文本信息。C#的字符串类型是System.String&#xff0c;它是一个引用类型&#xff0…...

Unity Shader 学习18:Shader书写基本功整理

1. Drawer [HideInInspector]&#xff1a;面板上隐藏[NoScaleOffset]&#xff1a;隐藏该纹理贴图的TillingOffset[Normal]&#xff1a;检查该纹理是否设为法线贴图[HDR]&#xff1a;将颜色类型设为高动态范围颜色&#xff08;摄像机也要开启HDR才有效果&#xff09;[PowerSlid…...

构建第一个SpringBoot程序

第一种方式&#xff1a; 注&#xff0c;构建过程中一定要联网 new module -->选择spring Initializr 选择Web --> 勾选Spring Web --> create 构建好的项目如下 这里的 .mvn .git* HELP.md mvnw* 都可以删除 编辑好controller 之后 点击即可运行第一个springbo…...

Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器

JVM是Java高级部分&#xff0c;深入理解程序的运行及原理&#xff0c;面试中也问的比较多。 JVM是Java程序运行的虚拟机环境&#xff0c;实现了“一次编写&#xff0c;到处运行”。它负责将字节码解释或编译为机器码&#xff0c;管理内存和资源&#xff0c;并提供运行时环境&a…...

使用飞书API自动化更新共享表格数据

飞书API开发之自动更新共享表格 天马行空需求需求拆解1、网站数据爬取2、飞书API调用2.1 开发流程2.2 创建应用2.3 配置应用2.4 发布应用2.5 修改表格权限2.6 获取tenant_access_token2.7 调用API插入数据 总结 天马行空 之前一直都是更新的爬虫逆向内容&#xff0c;工作中基本…...

C++中ShellExecute函数使用方法说明,如果一开始参数为隐藏,后面还能再显示出来吗

文章目录 一、ShellExecute基础用法函数原型关键参数 nShowCmd示例代码&#xff1a;启动程序并隐藏窗口 二、隐藏后能否重新显示窗口直接答案 三、实现隐藏后显示窗口的步骤1. 获取目标窗口句柄2. 显示窗口 四、完整流程示例五、注意事项六、总结 在C中使用ShellExecute函数时&…...

MySQL的多表查询

我们之前在讲解SQL语句的时候&#xff0c;讲解了DQL语句&#xff0c;也就是数据查询语句&#xff0c;但是之前讲解的查询都是单表查询&#xff0c;而本章节我们要学习的则是多表查询操作&#xff0c;主要从以下几个方面进行讲解。 5.1 多表关系 项目开发中&#xff0c;在进行…...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之层级选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第五种写法&#xff0c;层级选择器 &#xff0c;你要根据网页中的实际情况来判断自己到底要用哪一种方法来进行元素定位。每种方法都要多练习&#xff0c;全都熟了之后你在工作当中使…...

《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务

《Python Web部署应知应会》No2&#xff1a;如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务&#xff08;上&#xff09; 摘要&#xff1a; 在 FastAPI 和 OLLAMA 架构中实现高并发 AI 推理服务&#xff0c;并优化性能指标采集和缓存策略&#xff0c;可以充分利用 asy…...

【LeetCode 题解】算法:8.字符串转换整数(atoi)

一、问题描述 在 LeetCode 的算法题库里&#xff0c;有这样一道题目&#xff0c;要求我们实现一个名为 myAtoi(string s) 的函数&#xff0c;其功能是将给定的字符串转换为一个 32 位有符号整数。具体的转换规则如下&#xff1a; 处理步骤 剔除前导空格&#xff1a;读取字符串…...

Uni-app页面信息与元素影响解析

获取窗口信息uni.getWindowInfo {pixelRatio: 3safeArea:{bottom: 778height: 731left: 0right: 375top: 47width: 375}safeAreaInsets: {top: 47, left: 0, right: 0, bottom: 34},screenHeight: 812,screenTop: 0,screenWidth: 375,statusBarHeight: 47,windowBottom: 0,win…...

飞书电子表格自建应用

背景 coze官方的插件不支持更多的飞书电子表格操作&#xff0c;因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后&#xff0c;就可以拿到id和key 参考教程&#xff1a; 创…...

《云原生安全攻防》-- K8s容器安全:权限最小化与SecurityContext

一旦容器被入侵&#xff0c;攻击者就可以获取到容器的权限&#xff0c;所以&#xff0c;容器运行过程中&#xff0c;我们首先需要考虑的是容器的权限问题。 在本节课程中&#xff0c;我们将重点介绍权限最小化以及如何使用SecurityContext来管理容器的权限。 在这个课程中&…...