Qt6相对Qt5的主要提升(AI总结)

news2025/3/26 3:11:47

我:

Qt 6 相对于5 有哪些新功能?

Avatar

Qt 6 相对于 Qt 5 有诸多新功能和改进,以下是主要的新增特性:

1. 架构和核心库的重构

  • 模块化设计:Qt 6 采用了更加灵活的模块化设计,开发者可以按需引入必要的功能模块,而不必加载所有库,降低了项目体积,提高了构建效率。

  • C++17 和 C++20 支持:Qt 6 全面支持 C++17,并部分支持 C++20,利用现代 C++ 特性,如结构化绑定、if constexpr 和自动内存管理等,让代码更简洁、性能更高。

  • 新的属性和绑定系统:引入了 QProperty 系统,通过 C++ 中的绑定支持提高代码速度,并与 QObject 无缝集成。

2. 图形渲染和 3D 支持

  • 渲染硬件接口(RHI):Qt 6 引入了全新的 RHI,为不同的图形 API(如 OpenGL、Direct3D、Vulkan 和 Metal)提供统一的抽象接口,使得 Qt 应用能够在不同平台上轻松利用硬件加速渲染。

  • Qt Quick 3D:对 QtQuick 3D 的底层渲染管线进行了优化,支持多种 3D 渲染效果,增强了光照、纹理和材质处理能力。

  • 3D 粒子系统:在 Qt Quick 3D 或 Qt Design Studio 中可以自定义 3D 粒子。

3. 多媒体模块的改进

  • Qt Multimedia 重构:Qt 6 对多媒体模块进行了彻底重构,支持更多现代多媒体格式,并引入了硬件加速,提高了音频和视频处理的效率。

4. 用户界面和输入支持

  • 高 DPI 支持:Qt 6 进一步增强了对高分辨率屏幕的支持,自动调整 UI 元素和文本的尺寸与比例。

  • 输入系统改进:提升了对多点触控和手势的支持,增强了对游戏手柄等外部设备的支持。

5. 并发和性能优化

  • 并发 API 的改进:Qt 6 改进了并发 API,支持多核 CPU 和并行计算,能够自动根据硬件进行线程数量管理。

6. 开发工具和构建系统

  • CMake 支持:Qt 6 提供了对 CMake 构建系统的更好支持,建议新项目使用 CMake。

  • Qt Creator 改进:Qt Creator 增加了对 Qt 6 新特性的支持,并提供了更强大的代码编辑和调试工具。

7. 其他改进

  • Qt Quick Controls 2:提供了像素级完美、原生外观的控件,无缝集成到操作系统。

  • 网络功能改进:允许创建自定义通信后端,并将其集成到默认的 Qt 工作流中。

这些新功能和改进让 Qt 6 在性能、现代图形 API 支持、多媒体处理和跨平台兼容性方面都得到了显著提升。

我:

新的属性和绑定系统:引入了 QProperty 系统,通过 C++ 中的绑定支持提高代码速度,并与 QObject 无缝集成。 展开详细说说,具体使用方法

Avatar

Qt 6 中引入的 QProperty 系统是其新属性和绑定系统的核心,它通过 C++ 的绑定支持提高了代码速度,并与 QObject 无缝集成。以下是关于 QProperty 系统的具体使用方法和特点:

1. 基本概念

QProperty 是 Qt 6 中引入的一个模板类,用于定义和管理对象的属性。它类似于 Qt 5 中的 Q_PROPERTY 宏,但提供了更强大的功能和更好的性能。

2. 声明和定义属性

在 Qt 6 中,可以通过 QProperty 在类中声明属性。以下是一个简单的例子:

cpp复制

#include <QObject>
#include <QProperty>

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = nullptr) : QObject(parent), m_value(0) {}

    Q_PROPERTY(int value MEMBER m_value NOTIFY valueChanged)

signals:
    void valueChanged();
private:
    int m_value;
};

在这个例子中:

  • 使用 Q_PROPERTY 宏声明了一个名为 value 的属性。

  • 使用 MEMBER 关键字将属性与类的成员变量 m_value 绑定。

  • 定义了一个 valueChanged 信号,用于在属性值改变时发出通知。

3. 使用 QProperty 读取和设置属性值

QProperty 提供了直接访问属性值的方法,而无需显式调用 READWRITE 函数。例如:

cpp复制

MyClass obj;
obj.value = 42; // 设置属性值
int currentValue = obj.value; // 获取属性值

这种方式类似于直接操作成员变量,但仍然保留了属性系统的所有功能。

4. 属性值改变的通知机制

当属性值发生变化时,可以通过 NOTIFY 关键字指定的信号通知其他对象。例如:

cpp复制

MyClass obj;
QObject::connect(&obj, &MyClass::valueChanged, [](){
    qDebug() << "Value changed!";
});
obj.value = 100; // 触发 valueChanged 信号

这种方式使得属性值的变化可以被其他对象轻松捕获。

5. 在 QML 中使用 QProperty

QProperty 系统与 QML 的集成非常紧密。在 QML 中可以直接绑定 QProperty 声明的属性,从而实现 C++ 后端与 QML 前端的无缝通信。例如:

qml复制

import QtQuick 2.0
Item {
    id: myItem
    property int myValue: myObject.value
    Component.onCompleted: {
        var myObject = new MyClass()
    }
}

这种方式使得 QML 可以直接访问和操作 C++ 类的属性。

6. 性能优化

QProperty 系统通过 C++ 的绑定支持提高了代码速度。它利用现代 C++ 特性(如 constexpr 和模板元编程)减少了运行时的开销,同时保持了 Qt 属性系统的灵活性。

7. 动态属性

除了静态声明的属性,QProperty 也支持动态属性。可以在运行时为对象添加属性,而无需在类定义中预先声明。

总结

QProperty 系统是 Qt 6 中一个重要的改进,它不仅提供了更高效的属性管理和通知机制,还与 QML 和信号槽机制无缝集成。通过 QProperty,开发者可以更轻松地实现属性的动态访问和绑定,同时享受性能优化带来的好处。

我:

并发和性能优化 并发 API 的改进:Qt 6 改进了并发 API,支持多核 CPU 和并行计算,能够自动根据硬件进行线程数量管理。 展开详细说说

Avatar

Qt 6 在并发和性能优化方面进行了显著改进,特别是在并发 API 的增强上,这些改进使得 Qt 6 能够更好地利用多核 CPU 和并行计算能力,从而提升应用程序的性能和响应速度。以下是 Qt 6 在并发和性能优化方面的具体改进和使用方法:

1. 新的并发模块:Qt Concurrent

Qt 6 引入了新的 Qt Concurrent 模块,该模块提供了更强大和灵活的并发编程支持。Qt Concurrent 的目标是简化多线程编程,让开发者更容易地实现并行计算。

1.1 并行算法

Qt 6 的 Qt Concurrent 模块提供了类似于 C++17 标准库中的并行算法支持。例如,std::for_eachstd::transform 等算法现在可以以并行方式执行。以下是一个简单的例子:

cpp复制

#include <QtConcurrent/QtConcurrent>
#include <QVector>
#include <QDebug>

void processItem(int& item) {
    item *= 2; // 示例操作
}

int main() {
    QVector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 使用 QtConcurrent::for_each 并行处理数据
    QtConcurrent::blockingMap(data, processItem);

    qDebug() << "Processed data:" << data;
    return 0;
}

在这个例子中,QtConcurrent::blockingMap 会并行地对 data 中的每个元素调用 processItem 函数。blockingMap 是一个阻塞版本,它会等待所有线程完成后再继续执行。

1.2 并行任务

Qt 6 还提供了 QtConcurrent::run,用于并行启动任务。这些任务可以是普通的函数、Lambda 表达式或成员函数。以下是一个例子:

cpp复制

#include <QtConcurrent/QtConcurrent>
#include <QDebug>

void myTask(int value) {
    qDebug() << "Processing value:" << value;
}

int main() {
    // 并行启动任务
    QtConcurrent::run(myTask, 42);
    QtConcurrent::run([]() {
        qDebug() << "Processing lambda task";
    });

    // 阻塞等待所有任务完成
    QtConcurrent::blockingMap(QVector<int>{1, 2, 3}, [](int& value) {
        value *= 2;
    });

    return 0;
}

在这个例子中,QtConcurrent::run 会启动一个新线程来执行 myTask 函数和 Lambda 表达式。

2. 自动线程管理

Qt 6 的并发模块能够自动根据硬件配置(如 CPU 核心数)管理线程数量。这意味着开发者无需手动管理线程池的大小,Qt 会根据系统资源动态调整线程数量,以实现最佳性能。

2.1 线程池的改进

Qt 6 内部使用了一个全局线程池(QThreadPool),该线程池会根据系统的核心数自动调整线程数量。开发者可以通过 QThreadPool::globalInstance() 访问全局线程池,并对其进行配置。例如:

cpp复制

#include <QThreadPool>
#include <QDebug>

int main() {
    // 获取全局线程池
    QThreadPool* pool = QThreadPool::globalInstance();

    // 打印当前线程池的最大线程数
    qDebug() << "Max thread count:" << pool->maxThreadCount();

    // 可以手动设置最大线程数(通常不推荐)
    pool->setMaxThreadCount(8);

    return 0;
}

默认情况下,Qt 会根据系统的 CPU 核心数自动设置线程池的最大线程数。

3. 任务依赖和同步

Qt 6 的并发模块还支持任务依赖和同步机制,这使得复杂的并行任务可以更容易地实现。例如,可以使用 QFutureQFutureWatcher 来监控任务的执行状态,并在任务完成时执行后续操作。

cpp复制

#include <QtConcurrent/QtConcurrent>
#include <QFutureWatcher>
#include <QDebug>

void myTask() {
    qDebug() << "Task is running";
}

int main() {
    QFutureWatcher<void> watcher;

    // 启动任务
    QFuture<void> future = QtConcurrent::run(myTask);

    // 将任务与 QFutureWatcher 关联
    watcher.setFuture(future);

    // 连接任务完成信号
    QObject::connect(&watcher, &QFutureWatcher<void>::finished, []() {
        qDebug() << "Task finished";
    });

    return 0;
}

在这个例子中,QFutureWatcher 用于监控任务的执行状态,并在任务完成时发出信号。

4. 性能优化

Qt 6 在性能优化方面做了大量工作,特别是在多线程和并行计算方面。以下是一些关键的性能优化措施:

4.1 减少线程切换开销

Qt 6 通过优化线程池的调度算法,减少了线程切换的开销。这意味着任务可以在更短的时间内完成,从而提高应用程序的整体性能。

4.2 数据局部性优化

Qt 6 在内部对数据访问进行了优化,以提高数据局部性。这意味着线程在访问数据时,可以更高效地利用 CPU 缓存,从而减少内存访问延迟。

4.3 异步操作支持

Qt 6 提供了更好的异步操作支持,使得开发者可以更容易地实现非阻塞操作。例如,QFutureQPromise 提供了一种简单的方式来处理异步任务的结果。

5. 使用示例

以下是一个完整的示例,展示了如何在 Qt 6 中使用并发 API 来实现并行计算和任务同步:

cpp复制

#include <QtConcurrent/QtConcurrent>
#include <QFutureWatcher>
#include <QVector>
#include <QDebug>

void processItem(int& item) {
    item *= 2; // 示例操作
}

void myTask() {
    qDebug() << "Task is running";
}

int main() {
    // 创建数据
    QVector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 并行处理数据
    QtConcurrent::blockingMap(data, processItem);

    // 启动异步任务
    QFutureWatcher<void> watcher;
    QFuture<void> future = QtConcurrent::run(myTask);
    watcher.setFuture(future);

    // 监控任务完成
    QObject::connect(&watcher, &QFutureWatcher<void>::finished, []() {
        qDebug() << "Task finished";
    });

    // 打印处理后的数据
    qDebug() << "Processed data:" << data;

    return 0;
}

在这个示例中:

  • 使用 QtConcurrent::blockingMap 对数据进行并行处理。

  • 使用 QtConcurrent::run 启动一个异步任务,并通过 QFutureWatcher 监控任务的完成状态。

总结

Qt 6 的并发 API 改进使得多线程编程更加简单和高效。通过自动线程管理、并行算法支持、任务依赖和同步机制,Qt 6 能够充分利用多核 CPU 的计算能力,从而显著提升应用程序的性能和响应速度。开发者可以更容易地实现复杂的并行任务,而无需深入底层线程管理细节。

我:

Qt 6 进一步增强了对高分辨率屏幕的支持,具体到什么分辨率?

Avatar

在 Qt 6 中,高 DPI 支持得到了显著增强,但并没有明确限定具体的分辨率上限。Qt 6 默认启用了高 DPI 缩放功能,能够自动适应各种高分辨率屏幕,包括但不限于常见的 2K、4K、甚至是更高分辨率的显示器。

Qt 6 的高 DPI 支持特点

  1. 自动缩放:Qt 6 默认启用高 DPI 缩放(Qt::AA_EnableHighDpiScaling),并且无法通过代码禁用。这意味着应用程序会自动根据系统的 DPI 设置来调整界面元素的大小,以确保在高分辨率屏幕上显示清晰。

  2. 环境变量控制:开发者可以通过设置环境变量来进一步调整缩放行为。例如:

    • QT_SCALE_FACTOR:设置全局缩放因子。

    • QT_SCREEN_SCALE_FACTORS:为每个屏幕设置不同的缩放因子。

  3. 动态调整:Qt 6 提供了灵活的接口(如 QGuiApplication::setHighDpiScaleFactorRoundingPolicy)来动态调整缩放策略。

  4. 高分辨率资源支持:Qt 的资源管理器会自动加载与当前 DPI 匹配的高分辨率资源文件(如图片、图标等),以确保界面元素在高 DPI 屏幕上清晰。

支持的分辨率范围

Qt 6 的高 DPI 支持并不局限于特定的分辨率,而是能够根据系统的 DPI 设置动态调整。例如:

  • 在 1920×1080 分辨率下,缩放比例可以是 100%、125%、150% 等。

  • 在更高分辨率(如 3840×2160,即 4K)下,Qt 6 也能通过自动缩放保持界面元素的清晰度。

总结

Qt 6 的高 DPI 支持能够自动适应各种高分辨率屏幕,无需开发者手动设置分辨率范围。通过环境变量和动态调整接口,开发者可以进一步优化应用程序在不同屏幕上的显示效果。

我:

自动内存管理 部分展开说说,列举点示例代码

Avatar

Qt 6 在自动内存管理方面进行了改进,主要体现在更智能的内存分配和释放机制,以及对现代 C++ 特性的支持。这些改进有助于减少内存泄漏和提高代码的可维护性。以下是一些关键点和示例代码,展示 Qt 6 中自动内存管理的改进。

1. 智能指针的使用

Qt 6 鼓励使用智能指针(如 std::shared_ptrstd::unique_ptr)来管理动态分配的内存。智能指针可以自动释放内存,从而减少内存泄漏的风险。

示例代码:使用 std::shared_ptr

cpp复制

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed\n"; }
    ~MyClass() { std::cout << "MyClass destructed\n"; }
};

int main() {
    // 使用 std::shared_ptr 自动管理内存
    std::shared_ptr<MyClass> myObject = std::make_shared<MyClass>();

    // 当 myObject 超出作用域时,MyClass 的析构函数会被自动调用
    return 0;
}

在这个例子中,std::shared_ptr 会自动管理 MyClass 的生命周期。当 myObject 超出作用域时,MyClass 的析构函数会被自动调用,释放分配的内存。

示例代码:使用 std::unique_ptr

cpp复制

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed\n"; }
    ~MyClass() { std::cout << "MyClass destructed\n"; }
};

int main() {
    // 使用 std::unique_ptr 自动管理内存
    std::unique_ptr<MyClass> myObject = std::make_unique<MyClass>();

    // 当 myObject 超出作用域时,MyClass 的析构函数会被自动调用
    return 0;
}

在这个例子中,std::unique_ptr 也自动管理 MyClass 的生命周期,确保内存被正确释放。

2. QObject 的自动内存管理

Qt 6 继续支持 QObject 的自动内存管理机制。通过将对象的父对象设置为另一个 QObject,子对象会在父对象被销毁时自动释放。

示例代码:使用 QObject 的父子关系

cpp复制

#include <QObject>
#include <QDebug>

class MyObject : public QObject {
    Q_OBJECT
public:
    MyObject(QObject *parent = nullptr) : QObject(parent) {
        qDebug() << "MyObject constructed";
    }
    ~MyObject() {
        qDebug() << "MyObject destructed";
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建父对象
    QObject parent;

    // 创建子对象,并将其父对象设置为 parent
    MyObject child(&parent);

    // 当 parent 被销毁时,child 也会被自动销毁
    return app.exec();
}

在这个例子中,child 的父对象是 parent。当 parent 被销毁时,child 也会被自动销毁,从而避免了内存泄漏。

3. 使用 QScopedPointer 和 QSharedPointer

Qt 提供了自己的智能指针类 QScopedPointerQSharedPointer,这些类与 Qt 的信号和槽机制以及 QObject 的父子关系机制无缝集成。

示例代码:使用 QScopedPointer

cpp复制

#include <QScopedPointer>
#include <QDebug>

class MyClass {
public:
    MyClass() { qDebug() << "MyClass constructed"; }
    ~MyClass() { qDebug() << "MyClass destructed"; }
};

int main() {
    // 使用 QScopedPointer 自动管理内存
    QScopedPointer<MyClass> myObject(new MyClass());

    // 当 myObject 超出作用域时,MyClass 的析构函数会被自动调用
    return 0;
}

在这个例子中,QScopedPointer 会自动管理 MyClass 的生命周期,确保内存被正确释放。

示例代码:使用 QSharedPointer

cpp复制

#include <QSharedPointer>
#include <QDebug>

class MyClass {
public:
    MyClass() { qDebug() << "MyClass constructed"; }
    ~MyClass() { qDebug() << "MyClass destructed"; }
};

int main() {
    // 使用 QSharedPointer 自动管理内存
    QSharedPointer<MyClass> myObject(new MyClass());

    // 当 myObject 超出作用域时,MyClass 的析构函数会被自动调用
    return 0;
}

在这个例子中,QSharedPointer 会自动管理 MyClass 的生命周期,确保内存被正确释放。

4. 自动内存管理的信号和槽

Qt 6 支持在信号和槽中使用智能指针,这使得信号和槽的生命周期管理更加安全。

示例代码:信号和槽中的自动内存管理

cpp复制

#include <QObject>
#include <QDebug>
#include <QSharedPointer>

class MyObject : public QObject {
    Q_OBJECT
public:
    MyObject(QObject *parent = nullptr) : QObject(parent) {
        qDebug() << "MyObject constructed";
    }
    ~MyObject() {
        qDebug() << "MyObject destructed";
    }

public slots:
    void handleSignal(const QSharedPointer<MyObject>& obj) {
        qDebug() << "Received signal with object:" << obj.data();
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建对象
    QSharedPointer<MyObject> sender(new MyObject());
    QSharedPointer<MyObject> receiver(new MyObject());

    // 连接信号和槽
    QObject::connect(sender.data(), &MyObject::destroyed, receiver.data(), &MyObject::handleSignal);

    // 销毁 sender,触发信号
    sender.reset();

    return app.exec();
}

在这个例子中,senderreceiver 都是 QSharedPointer 管理的对象。当 sender 被销毁时,会触发 destroyed 信号,receiver 的槽函数会被调用,同时 sender 的内存会被自动释放。

总结

Qt 6 通过支持现代 C++ 的智能指针(如 std::shared_ptrstd::unique_ptr)以及 Qt 自己的智能指针类(如 QScopedPointerQSharedPointer),显著增强了自动内存管理功能。这些机制可以有效减少内存泄漏的风险,同时提高代码的可维护性和安全性。

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

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

相关文章

MyBatis操作数据库进阶——动态SQL

动态 SQL 是根据程序运行时的条件灵活生成不同 SQL 语句‌的技术。它的核心目的是在不修改代码‌ 的前提下&#xff0c;通过条件判断、循环等逻辑&#xff0c;动态拼接 SQL 片段&#xff0c;解决传统 SQL 语句死板、难以应对复杂业务场景的问题。 一、<if> 标签 先来观…

使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)

引言&#xff1a;一套快速实现 Llama3 中文微调的教程 主要参考&#xff1a;胖虎遛二狗的 B 站教学视频《【大模型微调】使用Llama Factory实现中文llama3微调》 ✅ 笔者简介&#xff1a;Wang Linyong&#xff0c;西工大&#xff0c;2023级&#xff0c;计算机技术 研究方向&am…

LabVIEW发电平台数据采集系统

本文详细介绍了基于LabVIEW的摇臂式波浪发电平台数据采集系统的设计与实现。通过整合LabVIEW软件与多种传感器技术&#xff0c;本系统能够有效提升数据采集的准确性和效率&#xff0c;为波浪能的利用和发电设备的优化提供科学依据。 ​ 项目背景 随着全球能源需求增长和环境保…

气象可视化卫星云图的方式:方法与架构详解

气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…

【蓝桥杯】每日练习 Day7

目录 前言 领导者 分析 代码 空调 分析 代码 面包店 分析 代码 前言 今天是第一部分的最后一天&#xff08;主打记忆恢复术和锻炼思维&#xff09;&#xff0c;从明天开始主播会逐步更新从位运算到dp问题的常见题型。 领导者&#xff08;分类讨论&#xff09; 分析 …

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

从国家能源到浙江交通投资,全息技术在能源交通领域的创新应用

一、3D全息技术行业应用参数及设计制作要求 全息投影 全息投影技术通过激光器、全息片等设备&#xff0c;将物体的三维信息记录下来&#xff0c;并在特定条件下再现。应用参数包括投影距离、投影面积、投影亮度等。设计制作要求&#xff1a;高清晰度、高亮度、低噪音、稳定性好…

PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一

PageHiOffice网页组件作为最新一代的WebOffice文档控件&#xff0c;这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件&#xff0c;是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年&#xff0c;不管是功能性还是稳定性都已经有了长…

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步&#xff0c;就可以 点击搜索 Models &#xff1a; https://ollama.com/search然后点击下载&#xff1a; 选择后复制: ollama run deepseek-r1:32b例如&#xff1a; 让它安装完成后&#xff1…

Android:蓝牙设置配套设备配对

一、概述 在搭载 Android 8.0&#xff08;API 级别 26&#xff09;及更高版本的设备上&#xff0c;配套设备配对会代表您的应用对附近的设备执行蓝牙或 Wi-Fi 扫描&#xff0c;而不需要 ACCESS_FINE_LOCATION 权限。这有助于最大限度地保护用户隐私。使用此方法执行配套设备&am…

Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分

## 三、闭包作用域的存在原因及适用场景 ### 3.1 闭包作用域存在的原因 #### 3.1.1 数据封装与隐藏 闭包可以把数据封装在外部函数的作用域中&#xff0c;只有内部函数能够访问这些数据&#xff0c;这有助于实现数据的隐藏和保护。 python def counter(): count 0 def incre…

zookeeper使用

下载 官网 链接 1. 2. 然后解压&#xff1a; 启动 先复制一份这个文件&#xff0c; 双击启动 默认占用8080&#xff0c;和Tomcat冲突&#xff0c; 解决方法&#xff1a;链接 然后重启

使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug

最近在给客户开发一个CRM系统&#xff0c;其中用到了BOOTSTRAP的模态框。版本是3。由于是刚开始用该框架。所以在正式部署到项目中前&#xff0c;需要测试一下&#xff0c;找到框架中的如下部分。需要说明的是。我用的asp.net mvc框架开发。测试也是在asp.net mvc环境下。 复制…

【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Networking】系列。 前言 最近公司的安全部门在审计云环境安全性时经常提到service endpoint&#xff08;SE&#xff09;和priavate endpoint&#xff08;PE&#xff09;的术语&#xff0c;为此做了一些研究储备。 云…

Excel第41套全国人口普查

2. 导入网页中的表格&#xff1a;数据-现有链接-考生文件夹&#xff1a;网页-找到表格-点击→变为√-导入删除外部链接关系&#xff1a;数据-点击链接-选中连接-删除-确定&#xff08;套用表格格式-也会是删除外部链接&#xff09;数值缩小10000倍&#xff08;除以10000即可&am…

VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…

PDF文件转Markdown,基于开源项目marker

​ 首先我们来问下deepseek 为啥要选marker呢 基于深度学习&#xff0c;一看就逼格拉满。搞科研必备&#xff0c;效果应该不会太差。 看下官网 https://github.com/VikParuchuri/marker ​ 一看头像是个印度佬&#xff0c;自吹——又快又好。那就试试吧。 安装步骤 安装…

【蓝桥杯速成】| 9.回溯升级

题目一&#xff1a;组合综合 问题描述 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返…

【uni-app】引用公共组件

目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…

API-Arrays

Arrays 操作数组的工具类 1.tostring import java.util.Arrays;public class demo1 {public static void main(String[] args) {Integer[] arr {2, 3, 1, 5, 6, 7, 8, 4, 9};System.out.println(Arrays.toString(arr));//[2, 3, 1, 5, 6, 7, 8, 4, 9]} } 2.binarySearch 二…