QT桌面挂件动画

news2024/11/17 19:47:53

目录

  • 参考
  • 功能
  • 实现
    • 05DesktopPattern.pro
    • main.cpp
    • desktoppattern.h
    • desktoppattern.cpp
    • wallpaper.h
    • wallpaper.cpp
  • 效果
  • 模糊知识点

参考

图片资源

功能

  • 桌面挂件动画置顶
  • 切换挂件动画
  • 图片选择更换桌面壁纸
  • 显示时改变桌面壁纸,隐藏/退出时还原桌面壁纸
  • 系统托盘菜单,可选择开/关悬浮挂件功能按键
  • 悬浮挂件功能按键随鼠标区域显示/隐藏

实现

05DesktopPattern.pro

链接 user32 Advapi32

# 对于 Windows 平台,GetDesktopWindow 函数位于 user32.lib 库
LIBS += -luser32 -lAdvapi32

main.cpp

#include "desktoppattern.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    DesktopPattern w;
    w.show();
    return a.exec();
}

desktoppattern.h

#ifndef DESKTOPPATTERN_H
#define DESKTOPPATTERN_H

#include <QWidget>
#include <QTimer>
#include <QLabel>
#include <QDebug>
#include <QPushButton>
#include <QGraphicsDropShadowEffect>
#include <QEvent>
#include <QMouseEvent>
#include <QFileDialog>
#include <QApplication>
#include <QSystemTrayIcon>  // 将窗口嵌入到系统托盘
#include <QMenu>
#include "wallpaper.h"

class DesktopPattern : public QWidget

{
    Q_OBJECT

public:
    DesktopPattern(QWidget *parent = nullptr);
    ~DesktopPattern();
    bool eventFilter(QObject *watched,QEvent *ev) override;
    void setVisible(bool visible)override;
    void initButton();
    void showButton();
    void hideButton();
    void initWindowToSystemTray();// 初始化系统托盘
public slots:
    void updateRoleAnimation();// 更新角色动画
private:
    QLabel* roleLabel;
    qint8 curFrame;	//当前帧
    qint8 curPath;	//当前路径
    QList<QString> pathList;
    bool timerRunning = false;// 在类中添加一个标志变量
    bool hoverChoose = true; // 悬浮选择按钮开关

    QPushButton* closeBtn;
    QPushButton* cutBtn;
    QPushButton* openBtn;
    QSystemTrayIcon *trayIcon;  // 系统托盘

    Wallpaper *mWallpaper;
    QString wallpaperPath; // 替换为你的壁纸文件路径
};

#endif // DESKTOPPATTERN_H

desktoppattern.cpp

#include "desktoppattern.h"


DesktopPattern::DesktopPattern(QWidget *parent)
    : QWidget(parent)
{
    //setWindowFlags(Qt::FramelessWindowHint);// 无窗口的边框,
    //窗口将始终显示在其他窗口之上
    setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);

    setAttribute(Qt::WA_TranslucentBackground);// 背景透明 属性
    setWindowIcon(QIcon(":/resource/icon.ico"));
    curFrame=0;
    curPath = 0;	//当前路径
    pathList.append("background-image:url(:/resource/desktopRole/summerGril/%1.png);");
    pathList.append("background-image:url(:/resource/desktopRole/littleBoy/%1.png);");
    pathList.append("background-image:url(:/resource/desktopRole/blackGril/action1-happy/%1.png);");
    pathList.append("background-image:url(:/resource/desktopRole/blackGril/action2-sad/%1.png);");
    pathList.append("background-image:url(:/resource/desktopRole/blackGril/action3-naughty/%1.png);");
    pathList.append("background-image:url(:/resource/desktopRole/blackGril/action4-shy/%1.png);");

    // 定时器更新角色动画
    QTimer *updateTimer = new QTimer(this);
    updateTimer->callOnTimeout(this,&DesktopPattern::updateRoleAnimation);
    updateTimer->start(500);

    roleLabel = new QLabel(this);
    roleLabel->resize(500, 500);


    //给窗口设置阴影
    QGraphicsDropShadowEffect * effect=new QGraphicsDropShadowEffect(this);
    effect->setColor(QColor(230,231,232,220));
    effect->setBlurRadius(5);// 设置模糊半径
    this->setGraphicsEffect(effect);

    this->installEventFilter(this);// 安装事件过滤器

    initButton();
    initWindowToSystemTray();

    mWallpaper = new Wallpaper();
}

DesktopPattern::~DesktopPattern()
{
    if(mWallpaper)
        delete mWallpaper;
}

bool DesktopPattern::eventFilter(QObject *watched, QEvent *ev)
{
    if (/*watched == this && */ev->type() == QEvent::Enter) {
        // 鼠标进入窗口时执行的操作
        showButton();
    } else if (/*watched == this &&*/ ev->type() == QEvent::Leave) {
        // 鼠标离开窗口时执行的操作
        if (!timerRunning) {
            timerRunning = true;
            QTimer::singleShot(3000,this,&DesktopPattern::hideButton);
        }
    }

    QMouseEvent *mouseEv=static_cast<QMouseEvent*>(ev);
    static QPoint beginPos;
    if(ev->type()==QEvent::MouseButtonPress)    // 事件为 鼠标按下
    {
        beginPos = mouseEv->globalPos()-this->pos();
    }
    else if(ev->type()==QEvent::MouseMove && mouseEv->buttons()&Qt::MouseButton::LeftButton)
    {// 事件为 鼠标移动 && 鼠标是左键
        this->move(mouseEv->globalPos()-beginPos);
    }

    return QObject::eventFilter(watched, ev);
}

void DesktopPattern::setVisible(bool visible)
{
    if(visible){
        if(mWallpaper)
            mWallpaper->setPixmap(wallpaperPath);
        qDebug() << " ";
    }
    else {
        if(mWallpaper)
            mWallpaper->hide();
    }
    QWidget::setVisible(visible);
}

void DesktopPattern::initButton()
{
    closeBtn = new QPushButton(this);
    cutBtn= new QPushButton(this);
    openBtn= new QPushButton(this);
    closeBtn->setGeometry(320, 200, 36, 36);
    cutBtn->setGeometry(320, 240, 36, 36);
    openBtn->setGeometry(320, 280, 36, 36);
    closeBtn->setObjectName("closeBtn");
    cutBtn->setObjectName("cutBtn");

    closeBtn->setStyleSheet("background-image:url(:/resource/button/quit.png);background-repeat:no-repeat;");
    cutBtn->setStyleSheet("background-image:url(:/resource/button/cut.png);background-repeat:no-repeat;");
    openBtn->setStyleSheet("background-image:url(:/resource/button/open.png);background-repeat:no-repeat;");

    this->setStyleSheet("QPushButton{border:none;border-radius:5px;background-color:rgb(64,173,250)}\
                        QPushButton#closeBtn:hover{background-color:rgb(233,31,48);}\
                        QPushButton#cutBtn:hover{background-color:rgb(200,150,100);}");
    hideButton();

    connect(closeBtn,&QPushButton::pressed,this,&DesktopPattern::hide);
    connect(cutBtn,&QPushButton::pressed,this,[=](){
        curPath=(curPath+1)%pathList.count();
    });
    connect(openBtn,&QPushButton::pressed,this,[=](){
        QString filename = QFileDialog::getOpenFileName(nullptr,"选择壁纸","./","Image(*jpg *png)");
        if(filename.isEmpty())
            return;
        mWallpaper->setPixmap(filename);
        wallpaperPath= filename;
    });

    closeBtn->installEventFilter(this);
    cutBtn->installEventFilter(this);
    openBtn->installEventFilter(this);
    closeBtn->setToolTip("关闭");
    cutBtn->setToolTip("切换");
    openBtn->setToolTip("壁纸");
}

void DesktopPattern::showButton()
{
    if(!hoverChoose)
        return;
    closeBtn->show();
    cutBtn->show();
    openBtn->show();
}

void DesktopPattern::hideButton()
{
    closeBtn->hide();
    cutBtn->hide();
    openBtn->hide();
    timerRunning = false;
}

// 初始化系统托盘
void DesktopPattern::initWindowToSystemTray()
{
    trayIcon = new QSystemTrayIcon(this);
    trayIcon->setIcon(QIcon(":/resource/icon.ico"));
    trayIcon->setToolTip("桌面挂件动画");

    QMenu *trayMenu = new QMenu(this);
    QAction *hoverChooseAction = new QAction("HoverChoose", this);
    QAction *showAction = new QAction("Show", this);
    QAction *hideAction = new QAction("Hide", this);
    QAction *quitAction = new QAction("Quit", this);
    hoverChooseAction->setIcon(QIcon(":/resource/button/radio_btn_checked.png"));
    showAction->setIcon(QIcon(":/resource/button/sub.png"));
    hideAction->setIcon(QIcon(":/resource/button/quit.png"));
    quitAction->setIcon(QIcon(":/resource/button/shut.png"));

    trayMenu->addAction(hoverChooseAction);
    trayMenu->addAction(showAction);
    trayMenu->addAction(hideAction);
    trayMenu->addAction(quitAction);
    QString styleSheet = "QMenu{background-color: black;}\
                        QMenu::item {color: white;}\
                        QMenu::item:selected {color: yellow;}";
    trayMenu->setStyleSheet(styleSheet);//设置菜单背景色为黑色、字体颜色为白色、选中项字体颜色为黄色

    trayIcon->setContextMenu(trayMenu);

    connect(hoverChooseAction, &QAction::triggered, this, [=](){
        hoverChoose=!hoverChoose;
        if(hoverChoose)
            hoverChooseAction->setIcon(QIcon(":/resource/button/radio_btn_checked.png"));
        else
            hoverChooseAction->setIcon(QIcon(":/resource/button/radio_btn_normal.png"));
    });

    connect(showAction, &QAction::triggered, this, &DesktopPattern::show);
    connect(hideAction, &QAction::triggered, this, &DesktopPattern::hide);
    //connect(quitAction, &QAction::triggered, qApp, QApplication::quit);
    connect(quitAction, &QAction::triggered, qApp, [=](){
        // 在应用程序关闭前执行
        setVisible(false);
        QApplication::quit();
    });

    // 显示系统托盘图标
    trayIcon->show();
}

void DesktopPattern::updateRoleAnimation()
{
    QString qss("background-repeat:no-repeat;");// 关闭重复平铺
    roleLabel->setStyleSheet(qss+pathList.at(curPath).arg(curFrame));
    curFrame= (curFrame+1)%6;
}

wallpaper.h

#ifndef WALLPAPER_H
#define WALLPAPER_H

#include <QWidget>
#include <QLabel>
#include <QFile>
#include <QPixmap>
#include <QHBoxLayout>
#include<qt_windows.h>
#include <Windows.h>
#include<QDebug>
class Wallpaper : public QWidget
{
    Q_OBJECT
public:
    explicit Wallpaper(QWidget *parent = nullptr);
    ~Wallpaper();
    void setAllWallpaper();
    void restoreAllWallpaper(); // 还原壁纸
    QString getOriginalWallpaperPath();// 获取原壁纸
    void setPixmap(const QString& fileName);
    void setVisible(bool visible)override;
private:
    QLabel* bkLabel;	//放壁纸
    QPixmap bkPixmap;
    QString originalWallpaperPath; // 替换为你保存原始壁纸路径的变量
    QString wallpaperPath; // 替换为你的壁纸文件路径
signals:

};

#endif // WALLPAPER_H

wallpaper.cpp


#include "wallpaper.h"

Wallpaper::Wallpaper(QWidget *parent)
    : QWidget{parent}
{
    setWindowFlags(Qt::FramelessWindowHint);// 无窗口的边框
    setAttribute(Qt::WA_TranslucentBackground);// 属性为透明

    bkLabel = new QLabel(this);

    QHBoxLayout *horizon=new QHBoxLayout(this);
    horizon->setMargin(0);// 边界
    horizon->addWidget(bkLabel);

    originalWallpaperPath=getOriginalWallpaperPath();

//    setPixmap(":/resource/wallpaper/1.jpg");
//    setAllWallpaper();
}

Wallpaper::~Wallpaper()
{

}

void Wallpaper::setAllWallpaper()
{
#if 0
    //找到桌面的句柄(标识)
//    TCHAR className[MAX_PATH];
//    GetClassName(GetDesktopWindow(), className, MAX_PATH);
//    HWND desktopHwnd = FindWindow(className, nullptr);
     HWND desktopHwnd = GetDesktopWindow();
    if (!desktopHwnd)
    {
        qDebug() << "查找失败"<< desktopHwnd;
            return;
    }
    //把this设置给找到的窗口
    SetParent((HWND)this->winId(),desktopHwnd);
#endif

}

 // 还原壁纸
void Wallpaper::restoreAllWallpaper()
{
    // 在应用程序关闭之前将 originalWallpaperPath 设置为原始壁纸的路径
    // 应用程序关闭时恢复原始壁纸
    if (!SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID)originalWallpaperPath.utf16(), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE))
    {
            qDebug() << "还原壁纸失败";
            return;
    }
    qDebug() << "还原壁纸成功"<<originalWallpaperPath;
}
// 获取原壁纸
QString Wallpaper::getOriginalWallpaperPath()
{
    wchar_t wallpaperPath[MAX_PATH];
    if (SystemParametersInfoW(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaperPath, 0))
    {
            return QString::fromWCharArray(wallpaperPath);
    }
    return QString();
}

void Wallpaper::setPixmap(const QString &fileName)
{
#if 0
    if(QPixmap(fileName).isNull())
        return;
    bkPixmap.load(fileName);
    bkLabel->setPixmap(bkPixmap);
    this->hide();
    this->showFullScreen();// 全屏显示
#endif
    if(!QFile(fileName).exists())
            return;
    wallpaperPath = fileName;
    if (!SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID)wallpaperPath.utf16(), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE))
    {
            qDebug() << "更改壁纸失败";
            return;
    }
    qDebug() << "更改壁纸成功"<<wallpaperPath;
}

void Wallpaper::setVisible(bool visible)
{
    if(visible)
    {
        qDebug() << "壁纸显示";
    }
    else
        restoreAllWallpaper();
    QWidget::setVisible(visible);
}

效果

在这里插入图片描述

模糊知识点

  1. 系统托盘应用
#include <QSystemTrayIcon>
#include <QMenu>

trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(QIcon("xxx"));
trayIcon->setToolTip("xxx");

QMenu *trayMenu = new QMenu(this);
QAction *hoverChooseAction = new QAction("HoverChoose", this);
trayMenu->addAction(hoverChooseAction);

trayIcon->setContextMenu(trayMenu);
trayIcon->show();
  1. 当应用程序接收到 quitAction 的触发信号后,会调用 QApplication::quit() 来退出应用程序。因此,在退出之前,可能没有足够的时间来执行 setVisible(bool visible) 方法。
    如果你希望在应用程序退出之前执行一些操作,可以绑定使用 aboutToQuit 信号,该信号在应用程序即将退出时发出
connect(qApp, &QApplication::aboutToQuit, this, [=](void){  });
  1. SystemParametersInfoW Windows API 的函数
SystemParametersInfoW(
    _In_ UINT uiAction,
    _In_ UINT uiParam,
    _Pre_maybenull_ _Post_valid_ PVOID pvParam,
    _In_ UINT fWinIni);
`uiAction`:表示要执行的操作,可以是以下之一:
	SPI_SETDESKWALLPAPER :设置桌面壁纸。
	其他例如 SPI_SETICONMETRICS、SPI_SETKEYBOARDDELAY 等用于设置其他系统参数的标识符。
	
`uiParam`:取决于 uiAction 的值,通常用于传递额外的参数信息。比如,如果 uiAction 是 SPI_SETDESKWALLPAPER,那么 uiParam 可以是 0 或者其他与壁纸设置相关的参数。

`pvParam`:是一个指向参数数据的指针。具体取决于 uiAction 的值以及所需参数类型。例如,如果 uiAction 是 SPI_SETDESKWALLPAPER,那么 pvParam 应该是指向壁纸文件路径的指针。

`fWinIni`:是一个标志,指示是否应更新用户配置文件中的设置并通知系统更改。可以使用以下标志之一或它们的组合:
	SPIF_UPDATEINIFILE:将更改写入用户配置文件(如 INI 文件)。		
	SPIF_SENDCHANGE:在更改后立即向其它组件发送系统更改通知。
// 设置桌面壁纸
QString wallpaperPath="xxx";
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID)wallpaperPath.utf16(), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)


// 获取桌面壁纸路径
wchar_t wallpaperPath[MAX_PATH];
if (SystemParametersInfoW(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaperPath, 0))
{
        return QString::fromWCharArray(wallpaperPath);
}

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

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

相关文章

R语言复现一篇6分的孟德尔随机化文章

上一期我们对孟德尔随机化做了一个简单的介绍&#xff0c;今天我们来复现一篇6分左右的使用了孟德尔随机化方法的文章&#xff0c;文章的题目是&#xff1a;Mendelian randomization analysis does not reveal a causal influence of mental diseases on osteoporosis&#xff…

Angular 与 PDF之五 实现方式的选择与扩展

在纯web的前提下&#xff08;不考虑移动端native&#xff09;&#xff0c;PDF的功能基本包括&#xff1a; 客户端PDF&#xff1a;最简单的场景&#xff0c;实现方式也很多&#xff0c;基本不需要有什么顾虑的地方&#xff0c;简单的实现可以参考系列第一篇文章。客户端PDF预览&…

【NM 2019】综述:基于机器学习引导的定向进化蛋白质工程

Machine-learning-guided directed evolution for protein engineering | Nature Methods Machine-learning-guided directed evolution for protein engineering 机器学习引导的定向进化蛋白质工程 图1 | 带和不带机器学习的定向进化。 a&#xff09;定向进化利用迭代循环的…

MySQL数据库---笔记5

MySQL数据库---笔记5 一、锁1.1、介绍1.2、全局锁1.2.1、全局锁介绍1.2.2、一致性数据备份 1.3、表级锁1.3.1、表锁1.3.2、元数据锁&#xff08;meta data lock , MDL&#xff09;1.3.3、意向锁 1.4、行级锁1.4.1、介绍1.4.2、行锁1.4.3、间隙锁/临建锁 二、InnoDB引擎2.1、逻辑…

vue和node使用websocket实现数据推送,实时聊天

需求&#xff1a;node做后端根据websocket&#xff0c;连接数据库&#xff0c;数据库的字段改变后&#xff0c;前端不用刷新页面也能更新到数据&#xff0c;前端也可以发送消息给后端&#xff0c;后端接受后把前端消息做处理再推送给前端展示 1.初始化node&#xff0c;生成pac…

STM32杂记之单片机复位状态

参考源码 概况 复位后&#xff0c;器件从内部高速振荡器 &#xff08;HSI 8MHz&#xff09; 运行&#xff0c;FLASH 0 等待状态&#xff0c;FLASH预取缓冲区使能&#xff0c;除内部 SRAM、FLASH和 JTAG 外&#xff0c;所有外设均关闭。高速 &#xff08;AHB&#xff09; 和低…

LLaMA模型微调版本:斯坦福 Alpaca 详解

项目代码&#xff1a;https://github.com/tatsu-lab/stanford_alpaca 博客介绍&#xff1a;https://crfm.stanford.edu/2023/03/13/alpaca.html Alpaca 总览 Alpaca 是 LLaMA-7B 的微调版本&#xff0c;使用Self-instruct[2]方式借用text-davinct-003构建了52K的数据&#x…

三相一次重合闸程序逻辑原理(二)

在手动合闸至故障线路或手动分闸及保护或自动装置要求不允许重合闸&#xff08;如母线、变压器保护及低频减载动作&#xff09;等情况下&#xff0c;闭锁重合闸的输入开关量触点接通&#xff0c;H4输出“1”&#xff0c;非门Z4输出“0”&#xff0c;计数器清零&#xff08;CD0&…

健身戴哪种耳机好、适合健身运动的耳机推荐

随着越来越多的人加入运动健身的行列&#xff0c;市场上涌现出越来越多适用于跑步的运动耳机。对于喜欢运动的朋友们来说&#xff0c;一副优秀的运动耳机成为了必不可少的装备。当进行力量训练时&#xff0c;佩戴耳机可以帮助提升训练的专注度&#xff1b;而在进行有氧运动时&a…

部署 kubeadm 1.20

目录 一、环境准备二、所有节点安装docker三、所有节点安装kubeadm&#xff0c;kubelet和kubectl四、部署K8S集群 硬件准备 master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&#xff09; 192.168.154.10 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08…

oracle dblink mysql查询text无法显示问题

帮客户做了一个oracle到mysql的dblink之后&#xff0c;客户反馈发现有的表查询字段不全&#xff0c;通过select * 查询&#xff0c;mysql中有个字段INTERVENTION字段没有显示&#xff0c;首先想到的就是可能不支持查询&#xff0c;检查这个字段类型为text&#xff0c;猜测可能是…

LeetCode刷题 | 139. 单词拆分

139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode"…

直播预约|湘江公益直播大讲堂:以低代码助力中小企业数字化转型

在当今数字时代&#xff0c;中小企业面临着前所未有的机遇和挑战。在激烈的商业竞争环境中&#xff0c;如何快速、高效地实现数字化转型并提升企业的竞争力成为中小企业亟需解决的关键问题。 低代码平台的兴起&#xff0c;为中小企业的数字化转型带来了全新的解决方案。 6月29日…

企业级ChatGPT开发的三大核心内幕及案例实战(二)

2.2 企业级ChatGPT开发的三大核心剖析 Gavin老师:NLP_Matrix_Space 本节讲解LangChain官方提供的一个项目,跟大家展示企业级开发的核心元素,如图2-1所示,是项目的架构示意图。 图2- 1 LangChain项目架构示意图 一个基本原则是你的提示词和模型进行交互,作为和模型交互的…

如何用rust实现一个异步channel

目录 前言思路实现功能代码实现 测试先引测试版包测试代码结果与分析思考 尾语 前言 使用通信来共享内存&#xff0c;而不是通过共享内存来通信 上面这句话&#xff0c;是每个go开发者在 处理多线程通信时 的座右铭&#xff0c;go甚至把实现这个理念的channel直接焊在编译器里&…

台灯太亮会影响视力吗?选灯一定要注意这几个点!

灯太亮对眼睛有没有影响&#xff0c;取决于灯“亮”的程度和使用的时间。如果是偶尔有需求&#xff0c;灯过于亮&#xff0c;使用时间不长的话对眼睛倒是没有太大的影响。但如果是长时间使用的&#xff0c;就不能使用过亮的灯了&#xff0c;容易导致睫状肌代偿性收缩、导致眼睛…

RISC-V处理器的设计与实现(三)—— 上板验证

文章目录 RISC-V处理器的设计与实现&#xff08;一&#xff09;—— 基本指令集_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现&#xff08;二&#xff09;—— CPU框架设计_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现&#xff08;三&#xff09;—— 上板验…

人机混合智能概述

人机混合智能是指将人类的智能和计算机的智能结合起来&#xff0c;实现更加智能化的决策和行动。人机混合智能的发展历史可以追溯到20世纪50年代早期&#xff0c;当时计算机还是庞大的机器&#xff0c;只能由专业人员操作。但随着计算机技术的不断发展&#xff0c;出现了更为普…

JavaScript之鼠标事件、坐标轴、定位、clientXY、offsetXY、layerXY、pageXY、screenXY

文章目录 MouseEvent的事件类别阻止鼠标的默认事件去除单击右键菜单阻止图像默认拖拽阻止文字的拖拽和选择阻止表单提交及重置打印输出MouseEvent对象内容clientX和clientY与x和yoffsetXYlayerXYpageXYscreenXY总结 MouseEvent的事件类别 序号事件描述1mousedown鼠标按下2mouse…

多元回归预测 | Matlab鲸鱼算法(WOA)优化极限学习机ELM回归预测,WOA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab鲸鱼算法(WOA)优化极限学习机ELM回归预测,WOA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环…