Qt 实现自定义截图工具

news2024/12/28 18:53:49

目录

  • Qt 实现自定义截图工具
    • 实现效果图
    • PrintScreen 类介绍
      • PrintScreen 类的主要特性
    • 逐步实现
      • 第一步:类定义
      • 第二步:初始化截图窗口
      • 第三步:处理鼠标事件
      • 第四步:计算截图区域
      • 第五步:捕获和保存图像
    • 完整代码
      • PrintScreen.h
      • PrintScreen.cpp
      • MainWindow.h
      • MainWindow.cpp
      • main.cpp

Qt 实现自定义截图工具

本文使用Qt框架从头开始创建一个简单的屏幕截图工具。

实现效果图

截图按钮:
截图按钮
选取截图初始状态:
选取截图初始状态
选取截图区域:
选取截图区域
截图保存界面:
截图保存界面

PrintScreen 类介绍

PrintScreen 类是一个自定义的 QWidget,允许用户捕捉屏幕上的任意区域。本教程将展示如何利用 Qt 的多功能库来实现这一功能。

PrintScreen 类的主要特性

  • 全屏覆盖,用于选择要捕捉的屏幕区域。
  • 通过鼠标互动选择定义捕捉区域。
  • 拖放调整选定区域。
  • 将捕获的区域保存为图片文件。

逐步实现

第一步:类定义

首先定义继承自 QWidgetPrintScreen 类。包含必要的 Qt 头文件,并声明我们的函数和成员变量。

#include <QWidget>
#include <QPainter>

/**
 * @brief The PrintScreen class
 * @param 区域截屏功能
 */
class PrintScreen : public QWidget
{
    Q_OBJECT
public:
    PrintScreen(QWidget *parent = nullptr);
    ~PrintScreen();

private:
    /**
     * @brief 初始化截图窗口的背景和尺寸
     */
    void InitWindow();

    /**
     * @brief 根据起始点和终止点计算矩形区域
     * @param beginPoint 矩形区域的起始点
     * @param endPoint 矩形区域的终止点
     * @return 返回根据两点计算出的 QRect 对象
     */
    QRect GetRect(const QPoint &beginPoint, const QPoint &endPoint);

protected:
    // 事件处理方法
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    // 成员变量
    bool m_isMousePress = false;     // 是否按下鼠标
    bool m_captureComplete = false;  // 截图是否完成
    bool m_isDragging = false;       // 是否正在拖动截图区域

    QPixmap m_loadPixmap;    // 加载的屏幕截图
    QPixmap m_capturePixmap; // 截取的屏幕区域

    int m_screenWidth;       // 屏幕宽度
    int m_screenHeight;      // 屏幕高度

    QPoint m_beginPoint;     // 截图开始点
    QPoint m_endPoint;       // 截图结束点
    QPoint m_originalBegin;  // 原始截图开始点
    QPoint m_originalEnd;    // 原始截图结束点
    QPoint m_dragPosition;   // 拖动时的鼠标位置

    QPainter m_painter;      // 绘图器对象
};

第二步:初始化截图窗口

InitWindow 方法设置窗口属性,如全屏模式、无边框窗口提示和鼠标跟踪。它还捕获整个屏幕并存储在 m_loadPixmap 中。

void PrintScreen::InitWindow()
{
    // 启用鼠标跟踪
    this->setMouseTracking(true);
    // 设置无边框窗口
    this->setWindowFlags(Qt::FramelessWindowHint);
    // 设置窗口为激活状态和全屏模式
    setWindowState(Qt::WindowActive | Qt::WindowFullScreen);
    // 确保关闭时自动删除
    setAttribute(Qt::WA_DeleteOnClose);

    // 获取主屏幕
    QScreen *screen = QApplication::primaryScreen();
    // 抓取整个屏幕内容
    m_loadPixmap = screen->grabWindow(QApplication::desktop()->winId());
    // 设置屏幕宽度、高度
    m_screenWidth = m_loadPixmap.width();
    m_screenHeight = m_loadPixmap.height();
}

第三步:处理鼠标事件

鼠标事件对于定义捕获区域至关重要。mousePressEventmouseMoveEventmouseReleaseEvent 处理捕获区域的开始、调整和最终确定。

void PrintScreen::mousePressEvent(QMouseEvent *event)
{
    // 按下右键 关闭截图窗口
    if (event->button() == Qt::RightButton)
    {
        close();
    }
    // 按下左键
    else if (event->button() == Qt::LeftButton)
    {
        if (m_captureComplete && QRect(m_beginPoint, m_endPoint).contains(event->pos()))
        {
            m_isDragging = true;                          // 开始拖动
            m_dragPosition = event->pos() - m_beginPoint; // 计算开始拖动位置
        }
        else
        {
            m_isMousePress = true;       // 鼠标被按下
            m_isDragging = false;
            m_beginPoint = event->pos(); // 记录开始点
            m_originalBegin = m_beginPoint;
        }
    }
}

void PrintScreen::mouseMoveEvent(QMouseEvent *event)
{
    // 获取屏幕尺寸
    QRect screenRect = QGuiApplication::primaryScreen()->geometry();

    // 鼠标按下且截图未完成
    if (m_isMousePress && !m_captureComplete)
    {
        // 确保终点坐标不超过屏幕范围
        int x = qBound(screenRect.left(), event->pos().x(), screenRect.right());
        int y = qBound(screenRect.top(), event->pos().y(), screenRect.bottom());
        m_endPoint = QPoint(x, y);
    }
    // 正在拖动
    else if (m_isDragging)
    {
        QPoint newTopLeft = event->pos() - m_dragPosition;
        // 确保新的顶点坐标不超过屏幕范围
        int x = qBound(screenRect.left(), newTopLeft.x(), screenRect.right() - m_dragPosition.x());
        int y = qBound(screenRect.top(), newTopLeft.y(), screenRect.bottom() - m_dragPosition.y());
        newTopLeft = QPoint(x, y);

        QPoint offset = newTopLeft - m_beginPoint;
        m_beginPoint += offset;
        m_endPoint += offset;
    }

    update();
    return QWidget::mouseMoveEvent(event);
}

void PrintScreen::mouseReleaseEvent(QMouseEvent *event)
{
    // 鼠标释放且截图未完成
    if (m_isMousePress && !m_captureComplete)
    {
        m_endPoint = event->pos();  // 设置结束点
        m_isMousePress = false;     // 重置鼠标按下状态
        m_captureComplete = true;   // 标记截图完成
        update();
    }
    // 释放时正在拖动
    else if (m_isDragging)
    {
        m_isDragging = false;
    }
    update();
}

第四步:计算截图区域

GetRect 方法接收两个参数:beginPointendPoint,这两个点是用户通过鼠标操作定义的截图区域的开始和结束位置。此方法用于计算并返回一个 QRect 对象,该对象表示屏幕上要截取的矩形区域。

QRect PrintScreen::GetRect(const QPoint &beginPoint, const QPoint &endPoint)
{
    int x = std::min(beginPoint.x(), endPoint.x());
    int y = std::min(beginPoint.y(), endPoint.y());
    int width = std::abs(beginPoint.x() - endPoint.x());
    int height = std::abs(beginPoint.y() - endPoint.y());

    if (width == 0) width = 1;   // 确保宽度至少为1像素
    if (height == 0) height = 1; // 确保高度至少为1像素

    return QRect(x, y, width, height);
}

解释:

  • 计算 x 和 y 坐标:使用 std::min 函数确定矩形的左上角 x 和 y 坐标,这保证了无论用户如何拖动鼠标(从左到右或从右到左),都能正确计算出矩形的位置。
  • 计算宽度和高度:使用 std::abs 函数计算宽度和高度,确保值总是正数。如果计算结果为0(即起点和终点在同一直线上),则将宽度或高度设为1像素,确保矩形至少有最小的可见尺寸。

第五步:捕获和保存图像

paintEvent 方法在屏幕上绘制捕获的区域。keyPressEvent 监听回车键以触发保存捕获的图像。

void PrintScreen::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    m_painter.begin(this);                                           // 开始绘制
    QColor shadowColor(0, 0, 0, 100);                                // 半透明遮罩颜色
    m_painter.setPen(QPen(Qt::blue, 1, Qt::SolidLine, Qt::FlatCap)); // 设置画笔
    m_painter.drawPixmap(0, 0, m_loadPixmap);                        // 绘制加载的屏幕截图
    m_painter.fillRect(m_loadPixmap.rect(), shadowColor);            // 绘制半透明遮罩

    QRect selectedRect = GetRect(m_beginPoint, m_endPoint);          // 获取选择区域
    m_capturePixmap = m_loadPixmap.copy(selectedRect);               // 截取选择区域的屏幕截图
    m_painter.drawPixmap(selectedRect.topLeft(), m_capturePixmap);   // 绘制截取的区域
    m_painter.drawRect(selectedRect);                                // 绘制选择区域的边框
    m_painter.end();                                                 // 结束绘制
}
void PrintScreen::keyPressEvent(QKeyEvent *event)
{
    // 按下回车键
    if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)
    {
        // 保存图片
        QString filePath = QFileDialog::getSaveFileName(nullptr, "保存图片",QString(),"Images (*.png *.jpg)");
        if(!filePath.isEmpty())
        {
            m_capturePixmap.save(filePath); // 保存截图到文件
        }

        close();
    }
}

完整代码

PrintScreen.h

#ifndef PRINTSCREEN_H
#define PRINTSCREEN_H

#include <QWidget>
#include <QPainter>

/**
 * @brief The PrintScreen class
 * @param 区域截屏功能
 */
class PrintScreen : public QWidget
{
    Q_OBJECT
public:
    PrintScreen(QWidget *parent = nullptr);
    ~PrintScreen();

private:
    /**
     * @brief 初始化截图窗口的背景和尺寸
     */
    void InitWindow();

    /**
     * @brief 根据起始点和终止点计算矩形区域
     * @param beginPoint 矩形区域的起始点
     * @param endPoint 矩形区域的终止点
     * @return 返回根据两点计算出的 QRect 对象
     */
    QRect GetRect(const QPoint &beginPoint, const QPoint &endPoint);

protected:
    // 事件处理方法
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    // 成员变量
    bool m_isMousePress = false;     // 是否按下鼠标
    bool m_captureComplete = false;  // 截图是否完成
    bool m_isDragging = false;       // 是否正在拖动截图区域

    QPixmap m_loadPixmap;    // 加载的屏幕截图
    QPixmap m_capturePixmap; // 截取的屏幕区域

    int m_screenWidth;       // 屏幕宽度
    int m_screenHeight;      // 屏幕高度

    QPoint m_beginPoint;     // 截图开始点
    QPoint m_endPoint;       // 截图结束点
    QPoint m_originalBegin;  // 原始截图开始点
    QPoint m_originalEnd;    // 原始截图结束点
    QPoint m_dragPosition;   // 拖动时的鼠标位置

    QPainter m_painter;      // 绘图器对象
};

#endif // PRINTSCREEN_H

PrintScreen.cpp

#include "PrintScreen.h"

#include <QScreen>
#include <QFileDialog>
#include <QMouseEvent>
#include <QApplication>
#include <QDesktopWidget>

PrintScreen::PrintScreen(QWidget *parent)
    : QWidget{parent}
{
    InitWindow();
}

PrintScreen::~PrintScreen(){}

void PrintScreen::InitWindow()
{
    // 启用鼠标跟踪
    this->setMouseTracking(true);
    // 设置无边框窗口
    this->setWindowFlags(Qt::FramelessWindowHint);
    // 设置窗口为激活状态和全屏模式
    setWindowState(Qt::WindowActive | Qt::WindowFullScreen);
    // 确保关闭时自动删除
    setAttribute(Qt::WA_DeleteOnClose);

    // 获取主屏幕
    QScreen *screen = QApplication::primaryScreen();
    // 抓取整个屏幕内容
    m_loadPixmap = screen->grabWindow(QApplication::desktop()->winId());
    // 设置屏幕宽度、高度
    m_screenWidth = m_loadPixmap.width();
    m_screenHeight = m_loadPixmap.height();
}

QRect PrintScreen::GetRect(const QPoint &beginPoint, const QPoint &endPoint)
{
    int x = std::min(beginPoint.x(), endPoint.x());
    int y = std::min(beginPoint.y(), endPoint.y());
    int width = std::abs(beginPoint.x() - endPoint.x());
    int height = std::abs(beginPoint.y() - endPoint.y());

    if (width == 0) width = 1;   // 确保宽度至少为1像素
    if (height == 0) height = 1; // 确保高度至少为1像素

    return QRect(x, y, width, height);
}

void PrintScreen::mousePressEvent(QMouseEvent *event)
{
    // 按下右键 关闭截图窗口
    if (event->button() == Qt::RightButton)
    {
        close();
    }
    // 按下左键
    else if (event->button() == Qt::LeftButton)
    {
        if (m_captureComplete && QRect(m_beginPoint, m_endPoint).contains(event->pos()))
        {
            m_isDragging = true;                          // 开始拖动
            m_dragPosition = event->pos() - m_beginPoint; // 计算开始拖动位置
        }
        else
        {
            m_isMousePress = true;       // 鼠标被按下
            m_isDragging = false;
            m_beginPoint = event->pos(); // 记录开始点
            m_originalBegin = m_beginPoint;
        }
    }
}

void PrintScreen::mouseMoveEvent(QMouseEvent *event)
{
    // 获取屏幕尺寸
    QRect screenRect = QGuiApplication::primaryScreen()->geometry();

    // 鼠标按下且截图未完成
    if (m_isMousePress && !m_captureComplete)
    {
        // 确保终点坐标不超过屏幕范围
        int x = qBound(screenRect.left(), event->pos().x(), screenRect.right());
        int y = qBound(screenRect.top(), event->pos().y(), screenRect.bottom());
        m_endPoint = QPoint(x, y);
    }
    // 正在拖动
    else if (m_isDragging)
    {
        QPoint newTopLeft = event->pos() - m_dragPosition;
        // 确保新的顶点坐标不超过屏幕范围
        int x = qBound(screenRect.left(), newTopLeft.x(), screenRect.right() - m_dragPosition.x());
        int y = qBound(screenRect.top(), newTopLeft.y(), screenRect.bottom() - m_dragPosition.y());
        newTopLeft = QPoint(x, y);

        QPoint offset = newTopLeft - m_beginPoint;
        m_beginPoint += offset;
        m_endPoint += offset;
    }

    update();
    return QWidget::mouseMoveEvent(event);
}

void PrintScreen::mouseReleaseEvent(QMouseEvent *event)
{
    // 鼠标释放且截图未完成
    if (m_isMousePress && !m_captureComplete)
    {
        m_endPoint = event->pos();  // 设置结束点
        m_isMousePress = false;     // 重置鼠标按下状态
        m_captureComplete = true;   // 标记截图完成
        update();
    }
    // 释放时正在拖动
    else if (m_isDragging)
    {
        m_isDragging = false;
    }
    update();
}

void PrintScreen::keyPressEvent(QKeyEvent *event)
{
    // 按下回车键
    if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)
    {
        // 保存图片
        QString filePath = QFileDialog::getSaveFileName(nullptr, "保存图片",QString(),"Images (*.png *.jpg)");
        if(!filePath.isEmpty())
        {
            m_capturePixmap.save(filePath); // 保存截图到文件
        }

        close();
    }
}

void PrintScreen::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    m_painter.begin(this);                                           // 开始绘制
    QColor shadowColor(0, 0, 0, 100);                                // 半透明遮罩颜色
    m_painter.setPen(QPen(Qt::blue, 1, Qt::SolidLine, Qt::FlatCap)); // 设置画笔
    m_painter.drawPixmap(0, 0, m_loadPixmap);                        // 绘制加载的屏幕截图
    m_painter.fillRect(m_loadPixmap.rect(), shadowColor);            // 绘制半透明遮罩

    QRect selectedRect = GetRect(m_beginPoint, m_endPoint);          // 获取选择区域
    m_capturePixmap = m_loadPixmap.copy(selectedRect);               // 截取选择区域的屏幕截图
    m_painter.drawPixmap(selectedRect.topLeft(), m_capturePixmap);   // 绘制截取的区域
    m_painter.drawRect(selectedRect);                                // 绘制选择区域的边框
    m_painter.end();                                                 // 结束绘制
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

#include "PrintScreen.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QPushButton *m_screenBtn;
    PrintScreen *m_printScree;

    // QObject interface
public:
    bool eventFilter(QObject *watched, QEvent *event);
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include <QLayout>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , m_screenBtn(new QPushButton("截图", this))
{
    // 设置中心窗口
    setCentralWidget(m_screenBtn);
    // 安装事件过滤器
    m_screenBtn->installEventFilter(this);
    // 隐藏标题栏
    setWindowFlags(Qt::FramelessWindowHint);

    resize(150, 50);
}

MainWindow::~MainWindow() {}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == m_screenBtn && event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->button() == Qt::RightButton)
        {
            close();
            return true;
        }
        else if (mouseEvent->button() == Qt::LeftButton)
        {
            m_printScree = new PrintScreen();
            m_printScree->show();
            return true;
        }
    }
    return QMainWindow::eventFilter(watched, event);
}

main.cpp

#include "MainWindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

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

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

相关文章

重学SpringBoot3-SpringApplicationRunListener

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringApplicationRunListener 1. 基本作用2. 如何实现2.1. 创建SpringApplicationRunListener2.2. 注册SpringApplicationRunListener2.3. 完整示例 3.…

fpga系列 HDL:利用泰勒级数实现指数函数模块exponent

模块实现了指数函数的计算&#xff0c;利用泰勒级数展开进行近似计算。 e x 1 x 1 ! x 2 2 ! x 3 3 ! x 4 4 ! ⋯ e^x 1 \frac{x}{1!} \frac{x^2}{2!} \frac{x^3}{3!} \frac{x^4}{4!} \cdots ex11!x​2!x2​3!x3​4!x4​⋯ 它依赖于 floatMult 和 floatAdd 两个子…

解决 PyCharm 无法启动 Jupyter 服务器的问题:报错分析与解决方案

文章目录 报错背景报错详细信息解决方案pycharm 设置 报错背景 在使用 pycharm 付费版的过程中&#xff0c;发现一直无法启动 jupyter 服务器。 一直也不知道是为什么&#xff0c;直到在终端输入&#xff1a; jupyter notebook发现 jupyter 服务无法启动。 报错详细信息 下…

uniapp网络延迟优化之骨架屏

文章目录 前言uniapp网络延迟优化之骨架屏 一、骨架屏是什么&#xff1f;二、使用步骤1.在微信开发者工具生成骨架屏文件2.转成vue组件3.组件中使用4.效果展示4.开发时遇到的问题&#xff1f; 总结 前言 uniapp网络延迟优化之骨架屏 一、骨架屏是什么&#xff1f; 骨架屏的主…

在SOME/IP协议中Service Entry和Eventgroup Entry有什么作用?

在SOME/IP协议中,Service Entry和Eventgroup Entry是用于服务发现和事件订阅的关键元素。 1、Service Entry Service Entry主要用于服务发现,包括以下几种类型: Find Service:客户端发送请求以查找特定的服务。Offer Service:服务端广播其提供的服务,通知客户端该服务可…

基于Java的建筑节能监测系统+公共建筑能耗监测系统

建筑节能监测系统公共建筑能耗监测系统建筑能耗监测系统节能监测系统能耗监测建筑能耗监测能耗分析能耗管理能耗预测能耗监控能耗监测平台建筑能耗 介绍 能耗监控系统是为耗电量、耗水量、耗气量&#xff08;天然气量或者煤气量&#xff09;、集中供热耗热量、集中供冷耗冷量…

基于GA-PSO-BP混合神经网络的多输入多输出数据预测-Python代码实现

在机器学习中&#xff0c;多输入多输出&#xff08;MIMO&#xff09;问题常见于复杂系统建模、控制和预测。本文将介绍一种基于 GA-PSO-BP 混合算法的 MIMO 数据预测方法。我们结合遗传算法&#xff08;GA&#xff09;和粒子群优化算法&#xff08;PSO&#xff09;对 BP 神经网…

【Linux】多路转接select

一、select介绍 1.1 初始select 系统提供的select函数来实现多路复用输入/输出模型。 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的程序会停止在select这里等待&#xff0c;直到被监视的文件描述符有一个或者多个发生了状态改变 IO 等 拷贝&#xff0…

JavaDS —— LRUCache

概念 LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c; 通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂贵但较快速的SRAM技术。…

SpringBoot实现房产销售系统全解析

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

灌区信息化发展趋势展望

灌区信息化作为现代农业发展的重要组成部分&#xff0c;正逐渐成为提升水资源管理效率、保障粮食安全与促进农业可持续发展的关键途径。随着信息技术的飞速进步和智能化技术的广泛应用&#xff0c;灌区信息化的未来发展趋势展现出多维度、深层次的变革与创新&#xff0c;其发展…

C语言 13 指针

指针可以说是整个 C 语言中最难以理解的部分了。 什么是指针 还记得在前面谈到的通过函数交换两个变量的值吗&#xff1f; #include <stdio.h>void swap(int, int);int main() {int a 10, b 20;swap(a, b);printf("a %d, b %d", a, b); }void swap(int …

SSH 弱密钥交换算法 通过禁用CBC模式解决SSH服务器CBC加密模式漏洞(CVE-2008-5161)

自查方法 查看当前支持的加密算法 man sshd_config |grep -A 40 -w KexAlgorithms 修复方法 Linux平台 修改sshd_config配置文件&#xff0c;删除不安全的加密算法 重启服务 systemctl restart sshd 3.查看修改后的配置文件 sshd -T | grep -w kexalgorithms SSH 弱密…

【Python基础】Python迭代器与生成器(两种强大工具)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、迭代器2.1 创建迭代器2.2 自定义迭代器2.3 处理大型文件 三、生成器四、生成器表达式五、实际应用…

【数据结构初阶】队列接口实现及用队列实现栈超详解

文章目录 1. 概念1. 1 队列底层结构选型1. 2 队列定义 2. 接口实现2. 1 初始化2. 2 判空2. 3 入队列2. 4 出队列2. 5 队尾元素和队头元素和队列元素个数2. 6 销毁2. 7 接口的意义 3. 经典OJ题3. 1 用队列实现栈3. 1. 1 栈的定义3. 1. 2 栈的初始化3. 1. 3 入栈3. 1. 4 出栈3. 1…

计算机视觉(二)—— MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Applied Computer Vision and Pattern Recognition: 2nd Volume 截止时间&#xff1a; 摘要提交截止日期&#xff1a;2024年10月30日 投稿截止日期&#xff1a;2024年12月30日 目标及范围&#xff1a; 包括但不限于以下领域&#xff1a…

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…

上班炒股会被开除吗?公司是如何发现员工上班炒股?一文告诉你答案!

随着互联网金融的发展&#xff0c;股票交易变得越来越便捷&#xff0c;不少上班族选择利用工作之余的时间来进行股票投资。 然而&#xff0c;这种行为是否合规&#xff1f;公司又是如何发现并处理这种情况的呢&#xff1f;本文将为您解答这些问题。 一、上班炒股是否合规&…

JAVA毕业设计175—基于Java+Springboot+vue3的医院预约挂号管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的医院预约挂号管理系统(源代码数据库)175 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、医生、管理员三种角色 1、用户&#x…

交换机最常用的网络变压器分为DIP和SM

华强盛电子导读&#xff1a;交换机通用网络变压器插件48PIN最为常见 您好&#xff01;今天我要给您介绍一款真正能为您的工业生产带来变革的产品——华强盛工业滤波器。在如今这个高度数字化的工业时代&#xff0c;可靠的网络连接至关重要&#xff0c;而华强盛工业网络变压器就…