第十四课:采用 Qt 开发翻页/分页/多页窗体组件

news2024/12/23 15:22:21

功能描述:采用 Qt 开发一个翻页/分页/多页的窗体组件,封装为 QWidget 的子类,在你的应用程序中可直接使用。

一、最终演示效果

本次制作的翻页/分页/多页窗体组件是基于 Qt 开发,整个程序封装成 PageWidget 类,继承于 QWidget,在你的应用程序中可直接使用。

主要功能包括:向前一页、向后一页、定位到具体某一页,当前页用红色字体表示, 鼠标悬浮到某一页背景色显示蓝色,样式可根据用户需求进行修改。

二、翻页/分页/多页窗体组件开发

翻页/分页/多页窗体组件主要在 PageWidget.h 和 PageWidget.cpp 中封装了 PageWidget 类,实现了向前一页、向后一页、定位到具体某一页等功能。 

PageWidget.h 文件代码如下:

#ifndef PAGEWIDGET_H
#define PAGEWIDGET_H

#include <QWidget>
#include <QList>
#include <QLabel>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QLineEdit>
#include <QIntValidator>
#include <QDebug>

class PageWidget : public QFrame
{
    Q_OBJECT
public:
    // 翻页显示分成三个部分, 左...中...右,blockSize 表示每部分的标签个数
    PageWidget(int blockSize = 3);

    /**
     * @brief getBlockSize  获取每部分的标签个数
     * @return
     */
    int getBlockSize() const;

    /**
     * @brief setBlockSize      设置每部分的标签个数
     * @param blockSize         每部分的标签个数,block size 必须是奇数, 且最小为3
     */
    void setBlockSize(int blockSize);

    /**
     * @brief getMaxPage    获取总页数
     * @return
     */
    int getMaxPage() const;

    /**
     * @brief setMaxPage    设置总页数
     * @param maxPage       总页数值
     */
    void setMaxPage(int maxPage);

    /**
     * @brief getCurrentPage    获取当前页数
     * @return
     */
    int getCurrentPage() const;

    /**
     * @brief setCurrentPage    设置当前页
     * @param currentPage       当前页数值
     * @param signalEmitted     为 true 时发送 currentPageChanged(int) 信号
     */
    void setCurrentPage(int currentPage, bool signalEmitted = false);

protected:
    /**
     * @brief eventFilter       事件过滤器,响应上一页标签和下一页标签的点击事件
     * @param watched           发生事件的组件
     * @param e                 发生事件的类型
     * @return
     */
    virtual bool eventFilter(QObject * watched, QEvent * e);

signals:
    /**
     * @brief currentPageChanged        当前页信号
     * @param page                      页码
     */
    void currentPageChanged(int page);

private:
    // 字体
    QFont font;
    // 前一页,"<"
    QLabel * previousPageLabel = nullptr;
    // 左侧部分标签的容器
    QWidget * leftPagesWidget = nullptr;
    // 左侧分隔符,".."
    QLabel * leftSeparateLabel = nullptr;
    // 中间部分标签的容器
    QWidget * centerPagesWidget = nullptr;
    // 右侧分隔符,".."
    QLabel * rightSeparateLabel = nullptr;
    // 右侧部分标签的容器
    QWidget * rightPagesWidget = nullptr;
    // 下一页,">"
    QLabel * nextPageLabel = nullptr;

    // 翻页显示分成三个部分, 左...中...右,blockSize 表示每部分的标签个数
    int blockSize;
    // 总页数
    int maxPage;
    // 当前页
    int currentPage;
    // 存储所有的数字标签,总个数为 blockSize*3
    QList<QLabel *> pageLabels;

    /**
     * @brief initialize        标签初始化
     */
    void initialize();

    /**
     * @brief updatePageLabels  更新显示标签
     */
    void updatePageLabels();
};

#endif // PAGEWIDGET_H

PageWidget.cpp 文件代码如下:

#include "PageWidget.h"

PageWidget::PageWidget(int blockSize): blockSize(blockSize)
{
    setStyleSheet("background-color:#2B2C2E;color:rgba(255,255,255,0.85);");

    font = QFont("Times New Roman", 14);
    font.setBold(true);

    previousPageLabel = new QLabel;
    previousPageLabel->setFont(font);
    previousPageLabel->setAlignment(Qt::AlignCenter);
    previousPageLabel->setFixedSize(23,23);
    previousPageLabel->setText("<");
    previousPageLabel->setStyleSheet("QLabel{color:rgba(255,255,255,0.85); padding:2px;}"
                                     "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");

    leftPagesWidget = new QWidget;
    leftPagesWidget->resize(23,23);
    leftPagesWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    leftSeparateLabel = new QLabel;
    leftSeparateLabel->setFont(font);
    leftSeparateLabel->setAlignment(Qt::AlignCenter);
    leftSeparateLabel->setFixedSize(23,23);
    leftSeparateLabel->setText("..");
    leftSeparateLabel->setStyleSheet("QLabel{color:rgba(255,255,255,0.85);}");
    centerPagesWidget = new QWidget;
    centerPagesWidget->resize(23,23);
    centerPagesWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    rightSeparateLabel = new QLabel;
    rightSeparateLabel->setFont(font);
    rightSeparateLabel->setAlignment(Qt::AlignCenter);
    rightSeparateLabel->setFixedSize(23,23);
    rightSeparateLabel->setText("..");
    rightSeparateLabel->setStyleSheet("QLabel{color:rgba(255,255,255,0.85);}");
    rightPagesWidget = new QWidget;
    rightPagesWidget->resize(23,23);
    rightPagesWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    nextPageLabel = new QLabel;
    nextPageLabel->setFont(font);
    nextPageLabel->setAlignment(Qt::AlignCenter);
    nextPageLabel->setFixedSize(23,23);
    nextPageLabel->setText(">");
    nextPageLabel->setStyleSheet("QLabel{color:rgba(255,255,255,0.85); padding:2px;}"
                                 "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");

    QHBoxLayout * mainLayout = new QHBoxLayout;
    mainLayout->setMargin(0);
    mainLayout->setContentsMargins(0,0,0,0);
    mainLayout->setSpacing(0);
    mainLayout->addStretch(1);
    mainLayout->addWidget(previousPageLabel);
    mainLayout->addWidget(leftPagesWidget);
    mainLayout->addWidget(leftSeparateLabel);
    mainLayout->addWidget(centerPagesWidget);
    mainLayout->addWidget(rightSeparateLabel);
    mainLayout->addWidget(rightPagesWidget);
    mainLayout->addWidget(nextPageLabel);
    mainLayout->addStretch(1);

    setLayout(mainLayout);

    initialize();

    setMaxPage(1);
}

// 获取每部分的标签个数
int PageWidget::getBlockSize() const
{
    return blockSize;
}

// 设置每部分的标签个数,为了便于计算, block size 必须是奇数, 且最小为3
void PageWidget::setBlockSize(int blockSize)
{
    blockSize = qMax(blockSize, 3);
    if(blockSize%2 == 0)
    {
        ++blockSize;
    }
    this->blockSize = blockSize;
}

// 获取总页数
int PageWidget::getMaxPage() const
{
    return maxPage;
}

// 设置总页数
void PageWidget::setMaxPage(int page)
{
    page = qMax(page, 1);
    if(maxPage != page)
    {
        this->maxPage = page;
        this->currentPage = 1;
        updatePageLabels();
    }
}

// 获取当前页数
int PageWidget::getCurrentPage() const
{
    return currentPage;
}

// 设置当前页
void PageWidget::setCurrentPage(int page, bool signalEmitted)
{
    page = qMax(page, 1);
    page = qMin(page, maxPage);

    if(page != this->currentPage)
    {
        this->currentPage = page;
        updatePageLabels();

        if(signalEmitted)
        {
            emit currentPageChanged(page);
        }
    }
}

// 事件过滤器,响应上一页标签和下一页标签的点击事件
bool PageWidget::eventFilter(QObject * watched, QEvent * e)
{
    if(e->type() == QEvent::MouseButtonRelease)
    {
        int page = -1;

        // 点击了前一页标签
        if(watched == previousPageLabel)
        {
            page = getCurrentPage()-1;
        }

        // 点击了后一页标签
        if(watched == nextPageLabel)
        {
            page = getCurrentPage()+1;
        }

        // 点击了具体数字的标签
        for(int i=0; i<pageLabels.count(); i++)
        {
            if(watched == pageLabels.at(i))
            {
                page = pageLabels.at(i)->text().toInt();
                break;
            }
        }

        if(page != -1)
        {
            setCurrentPage(page, true);
            return true;
        }
    }
    return QWidget::eventFilter(watched, e);
}

// 页码标签初始化,分成三个部分, 左...中...右
void PageWidget::initialize()
{
    previousPageLabel->installEventFilter(this);
    nextPageLabel->installEventFilter(this);

    QHBoxLayout * leftLayout = new QHBoxLayout();
    leftLayout->setMargin(0);
    leftLayout->setContentsMargins(0,0,0,0);
    leftLayout->setSpacing(0);

    QHBoxLayout * centerLayout = new QHBoxLayout();
    centerLayout->setMargin(0);
    centerLayout->setContentsMargins(0,0,0,0);
    centerLayout->setSpacing(0);

    QHBoxLayout * rightLayout = new QHBoxLayout();
    rightLayout->setMargin(0);
    rightLayout->setContentsMargins(0,0,0,0);
    rightLayout->setSpacing(0);

    for(int i=0; i<blockSize*3; ++i)
    {
        QLabel * label = new QLabel();
        font.setFamily("Times New Roman");
        label->setFont(font);
        label->setAlignment(Qt::AlignCenter);
        label->setFixedHeight(23);
        label->setMinimumWidth(23);
        label->setText(QString::number(i+1));
        label->setStyleSheet("QLabel{color:rgba(255,255,255,0.85); padding:2px;}"
                             "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");
        label->installEventFilter(this);

        pageLabels.append(label);

        if(i<blockSize)
        {
            leftLayout->addWidget(label);
        }
        else if(i<blockSize*2)
        {
            centerLayout->addWidget(label);
        }
        else
        {
            rightLayout->addWidget(label);
        }
    }

    leftPagesWidget->setLayout(leftLayout);
    centerPagesWidget->setLayout(centerLayout);
    rightPagesWidget->setLayout(rightLayout);
}

// 更新显示标签
void PageWidget::updatePageLabels()
{
    leftSeparateLabel->hide();
    rightSeparateLabel->hide();

    // 总页数小于 blockSize*3,总页数数值之前的 Label 都显示,之后的都隐藏
    if(maxPage <= blockSize*3)
    {
        for(int i=0; i<pageLabels.count(); i++)
        {
            QLabel * label = pageLabels.at(i);
            if(i<maxPage)
            {
                label->setText(QString::number(i+1));
                label->show();
            }
            else
            {
                label->hide();
            }

            if(currentPage-1 == i)
            {
                // 当前页的字体设置为蓝色
                label->setStyleSheet("QLabel{color:rgba(255,0,0,0.85); padding:2px;}"
                                     "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");
            }
            else
            {
                // 非当前页的字体设置为白色
                label->setStyleSheet("QLabel{color:rgba(255,255,255,0.85); padding:2px;}"
                                     "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");
            }
        }
        return;
    }

    // 以下情况为 maxPage 大于blockSize * 3, 所有的页码label都要显示
    // c 为 currentPage
    // n 为 block size
    // m 为 maxPage

    // 1. c ∈ [1, n + n/2 + 1]: 显示前 n * 2 个, 后 n 个: 只显示右边的分隔符
    // 2. c ∈ [m - n - n/2, m]: 显示前 n 个, 后 n * 2 个: 只显示左边的分隔符
    // 3. 显示[1, n], [c - n/2, c + n/2], [m - 2*n + 1, m]: 两个分隔符都显示

    int c = currentPage;
    int n = blockSize;
    int m = maxPage;
    int centerStartPage = 0;

    if(c >= 1 && c <= n+n/2+1)
    {
        // 1. c ∈ [1, n + n/2 + 1]: 显示前 n * 2 个, 后 n 个: 只显示右边的分隔符
        centerStartPage = n+1;
        rightSeparateLabel->show();
    }
    else if(c >= m-n-n/2 && c <= m)
    {
        // 2. c ∈ [m - n - n/2, m]: 显示前 n 个, 后 n * 2 个: 只显示左边的分隔符
        centerStartPage = m-n-n+1;
        leftSeparateLabel->show();
    }
    else
    {
        // 3. 显示[1, n], [c - n/2, c + n/2], [m - n + 1, m]: 两个分隔符都显示
        centerStartPage = c-n/2;
        rightSeparateLabel->show();
        leftSeparateLabel->show();
    }

    for(int i=0; i<n; ++i)
    {
        pageLabels.at(i)->setText(QString::number(i+1));                        // 前面 n 个
        pageLabels.at(n+i)->setText(QString::number(centerStartPage+i));        // 中间 n 个
        pageLabels.at(3*n-i-1)->setText(QString::number(m-i));                  // 后面 n 个
    }

    for(int i=0; i<pageLabels.count(); ++i)
    {
        QLabel * label = pageLabels.at(i);
        int page = label->text().toInt();
        if(page == currentPage)
        {
            // 当前页的字体设置为蓝色
            label->setStyleSheet("QLabel{color:rgba(255,0,0,0.85); padding:2px;}"
                                 "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");
        }
        else
        {
            // 非当前页的字体设置为白色
            label->setStyleSheet("QLabel{color:rgba(255,255,255,0.85); padding:2px;}"
                                 "QLabel:hover{color: black; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");

        }
        label->show();
    }
}

如果仅作为翻页/分页/多页组件使用的话,将以上两个文件直接添加到程序中即可使用。为了演示效果,我还写了 Widget.cpp 和 Widget.h 文件,集成翻页/分页/多页组件的使用。

Widget.h 文件代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include "PageWidget.h"

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget();

private slots:
    /**
     * @brief changeMaxPage  设置总页数
     */
    void changeMaxPage();

private:
    // 字体
    QFont font;
    // 总页数标签
    QLabel * maxPageLabel;
    // 总页数输入框
    QLineEdit * maxPageLineEdit;
    // 总页数设置
    QPushButton * maxPageBtn;
    // 分页窗口
    PageWidget * pageWidget;
};

#endif // WIDGET_H

Widget.cpp 文件代码如下:

#include "Widget.h"
#include "PageWidget.h"

Widget::Widget()
{
    setStyleSheet("background-color:#2B2C2E;color:rgba(255,255,255,0.85);");

    font = QFont("黑体", 12);

    maxPageLabel = new QLabel;
    maxPageLabel->setFont(font);
    maxPageLabel->setAlignment(Qt::AlignCenter);
    maxPageLabel->setFixedSize(80,23);
    maxPageLabel->setText("总页数:");

    maxPageLineEdit = new QLineEdit;
    font.setFamily("Times New Roman");
    maxPageLineEdit->setFixedHeight(23);
    maxPageLineEdit->setMinimumWidth(200);
    maxPageLineEdit->setFont(font);
    maxPageLineEdit->setAlignment(Qt::AlignCenter);
    maxPageLineEdit->setValidator(new QIntValidator(1,10000000));
    maxPageLineEdit->setStyleSheet("background-color:rgba(255,255,255,0.05); border-radius: 3px; margin:0px;");
    connect(maxPageLineEdit, SIGNAL(returnPressed()), this, SLOT(changeMaxPage()));

    maxPageBtn = new QPushButton;
    font.setFamily("黑体");
    maxPageBtn->setFont(font);
    maxPageBtn->setText("设置");
    maxPageBtn->setStyleSheet("QPushButton{background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #5EDCF8, stop:0.5 #82E5FB, stop:1 #06C9F4); color:rgb(255,255,255); border-radius:8px; margin:0px;}"
                              "QPushButton:pressed{background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #c0c0c0, stop:1 #808080); color:rgb(255,255,255); border-radius:8px; margin:0px;}"
                              "QPushButton:disabled{background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #c0c0c0, stop:1 #808080); color:rgb(255,255,255); border-radius:8px; margin:0px;}");
    maxPageBtn->setFixedSize(60,23);
    connect(maxPageBtn, SIGNAL(clicked()), this, SLOT(changeMaxPage()));

    pageWidget = new PageWidget;

    QHBoxLayout * topLayout = new QHBoxLayout();
    topLayout->setMargin(0);
    topLayout->setContentsMargins(0,0,0,0);
    topLayout->setSpacing(10);
    topLayout->addWidget(maxPageLabel);
    topLayout->addWidget(maxPageLineEdit);
    topLayout->addWidget(maxPageBtn);

    QVBoxLayout * mainLayout = new QVBoxLayout();
    mainLayout->setMargin(0);
    mainLayout->setContentsMargins(20,20,20,20);
    mainLayout->setSpacing(20);
    mainLayout->addLayout(topLayout);
    mainLayout->addWidget(pageWidget);

    setLayout(mainLayout);
}

// 设置总页数
void Widget::changeMaxPage()
{
    pageWidget->setMaxPage(maxPageLineEdit->text().toInt());
    pageWidget->setCurrentPage(1);
}

完整的代码已经贴上,每个函数的备注写的非常清楚,如有不清楚的地方可以私信我。

完整代码压缩包下载地址: 

https://download.csdn.net/download/tanou3212/88235059icon-default.png?t=N6B9https://download.csdn.net/download/tanou3212/88235059如果出现中文乱码的问题,请参考我的另外一篇博客《第十课:Qt 字符编码和中文乱码相关问题》 ,百分百能解决你的问题!

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

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

相关文章

Mac桌面小部件:Widgetter

Widgetter是一个基于Python的Web应用程序&#xff0c;用于创建和管理小部件的在线平台。该平台可以让用户轻松地创建和定制各种小部件&#xff0c;包括时钟、计算器、天气预报、地图等等。Widgetter还提供了一套易于使用的工具和界面&#xff0c;供用户进行小部件的编辑和布局。…

vue3 基础知识 (组件之间的通信 and vuex) 02

侬好哇 &#xff01;&#x1f60d; 文章目录 一、组件的通信 &#xff08;父传子&#xff09;二、非 Prop 的Attribute (属性&#xff09;三、组件的通信 &#xff08;子传父&#xff09;四、非父子组件的相互通信&#xff08;Provide/Inject&#xff09;五、非父子组件的相互通…

FPGA使用MIG调用SODIMM内存条接口教程,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、SODIMM内存条简介3、设计思路框架视频输入视频缓存MIG配置调用SODIMM内存条VGA时序视频输出 4、vivado工程详解5、上板调试验证6、福利&#xff1a;工程代码的获取 1、前言 FPGA应用中&#xff0c;数据缓存是一大重点&#xff0c;不管是图像处理还是A…

蓝牙防丢器(附HS6621芯片选型)

在繁忙的生活中&#xff0c;我们往往会因为疏忽而丢失贵重物品&#xff0c;如钱包、钥匙、手机等&#xff0c;给生活带来不小的麻烦。然而&#xff0c;现代科技正为我们提供一种聪明的解决方案——蓝牙防丢器。这款小巧智能的装置不仅保护您的财物&#xff0c;还为您的生活带来…

无涯教程-PHP - sql_regcase()函数

sql_regcase() - 语法 string sql_regcase (string string) 可以将sql_regcase()函数视为实用程序函数&#xff0c;它将输入参数字符串中的每个字符转换为包含两个字符的带括号的表达式。 sql_regcase() - 返回值 返回带括号的表达式字符串以及转换后的字符。 sql_regcase…

隧道vs免费爬虫ip:为何要选择隧道爬虫ip?

在网络爬虫的世界中&#xff0c;爬虫ip是一项关键技术&#xff0c;它可以帮助我们隐藏身份、突破限制、提高抓取效率。但是&#xff0c;在选择爬虫ip时&#xff0c;我们常常会面对隧道爬虫ip和免费爬虫ip之间的抉择。在本文中&#xff0c;我们将探讨隧道爬虫ip相对于免费爬虫ip…

再谈一下DDD中的聚合设计

何为聚合 在领域模型中&#xff0c;一些实体或者值对象具有强而有力的业务关联关系&#xff0c;于是这些对象就组成了一个聚合&#xff0c;聚合内部的业务实体之间必须保证状态一致性。从技术角度来看&#xff0c;聚合是数据修改与持久化的基本单元&#xff0c;聚合内数据修改…

docker实践作业

1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

SpeedBI数据可视化工具:浏览器上做分析

SpeedBI数据分析云是一种在浏览器上进行数据可视化分析的工具&#xff0c;它能够将数据以可视化的形式呈现出来&#xff0c;并支持多种数据源和图表类型。 所有操作&#xff0c;均在浏览器上进行 在浏览器中打开SpeedBI数据分析云官网&#xff0c;点击【免费使用】进入&#…

Faster RCNN网络数据流总结

前言 在学习Faster RCNN时&#xff0c;看了许多别人写的博客。看了以后&#xff0c;对Faster RCNN整理有了一个大概的了解&#xff0c;但是对训练时网络内部的数据流还不是很清楚&#xff0c;所以在结合这个版本的faster rcnn代码情况下&#xff0c;对网络数据流进行总结。以便…

生成式AI将催生出大量新的就业机会,倒逼14亿员工学习掌握新技能

尽管IBM的研报指出生成式AI的普及将为未来三年内的14亿劳动力带来必须学习和掌握新技能的挑战&#xff0c;但它也强调这股浪潮不会引发失业潮&#xff0c;相反&#xff0c;它将催生出大量新的就业机会。生成式AI被认为将在各种商业模式中发挥重要作用&#xff0c;为企业提供了利…

STM32CubeMx配置HAL库PWM

PWM简介 PWM(Pulse Width Modulation)是脉冲宽度调制的缩写&#xff0c;是一种利用微处理器的数字输出来对模拟电路进行控制的技术。PWM的原理是 通过调节占空比来调节脉冲宽度&#xff0c;从而改变输出电压的大小。波形图如下 PWM的两个重要参数为频率和占空比。频率是周期…

【最新附安装包】UG NX2023安装教程(CAD/CAM)

软件下载 软件&#xff1a;UG NX版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;10.78G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU3.0GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.c…

(动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】

❓剑指 Offer 10- II. 青蛙跳台阶问题 难度&#xff1a;简单 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1…

2023企业数智化转型的正确打开方式是什么?他这样说(三)

哈喽~又见面了大家&#xff01;上两期我们说到了数据在数智化转型中的重要性以及监控在数智化转型中的角色&#xff0c;戳这里↓↓↓&#xff0c;一键回放精彩内容 2023企业数智化转型的正确打开方式是什么&#xff1f;他这样说&#xff08;一&#xff09;https://mp.csdn.net…

MacBook 上的 Asahi Linux 将基于 Fedora Linux

MacBook 上的 Asahi Linux 将基于 Fedora Linux Asahi Linux 旨在将 Linux 移植到使用 M1、M2 等苹果硅芯片的 Mac 电脑上。它最初是基于 Arch Linux 的软件包构建的&#xff0c;采用 Arch Linux ARM&#xff0c;添加了自己的覆盖包资源库&#xff0c;并将所有的集成工作打包到…

支持4KHz回报的电竞鼠标,游戏操作更精准,雷柏VT950Pro上手

雷柏这两年推出的V系列外设很受还原&#xff0c;配合新近推出的4K电竞游戏技术&#xff0c;非常适合在高分辨率的显示器上玩游戏。目前很多雷柏经典的鼠标型号&#xff0c;也都出了新版本&#xff0c;设计更加炫酷&#xff0c;还可以支持4K了&#xff0c;配上一只4K接收器就可以…

elastic-job源码- job自动装配

版本&#xff1a;3.1.0-SNAPSHOT git地址&#xff1a;GitHub - apache/shardingsphere-elasticjob: Distributed scheduled job framework Maven 坐标 1 2 3 4 5 <dependency> <groupId>org.apache.shardingsphere.elasticjob</groupId> <artif…

vite+vue3使用@路径,报错处理

报错原因&#xff1a;未配置 符号为指定路径别名&#xff0c;直接使用导致 处理方法&#xff1a; 安装path模块&#xff1a; npm install --save-dev types/node修改vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from…

Hope.money:新兴DeFi项目如何重新定义稳定币生态的未来?

联储加息导致金融市场紧缩&#xff0c;Terra、3AC、FTX等知名中心化机构未能妥善应对而暴雷&#xff0c;并重创了整个加密货币市场&#xff0c;导致参与者损失惨重。这些事件揭示了中心化机构的局限&#xff0c;投资者对其资产掌控权的担忧愈发强烈。 自2018年首个DeFi协议Com…