QT开发实战-动态壁纸软件

news2024/11/19 8:23:29

动态壁纸软件开发

项目源代码在下面链接获取:

-----------------------------

开发者:CodeSharkSJ

希望此项目能加强你对Qt的应用

文章目录

  • 项目图与开发环境
  • 核心技术原理
  • 自定义窗口程序
  • UI布局
  • 背景绘制
  • 样式表
  • 基本实现
  • QWebEngine
  • QMedia使用
  • 系统托盘隐藏
  • 记忆功能
  • 应用程序打包


项目图与开发环境

开发环境: visual studio 2022 + Qt 5.14.1

项目图解:

 核心技术原理

桌面图标后面有一个背景窗体,这个窗体没有名字,但是类型属于workerW  

它的父类是Program Maneger,

遍历所有workerW类型的窗体,逐一比较它的父窗体是不是Program Manager就可以找到背景窗体。 但如果没有找到可以发送消息生成一个生成一个WorkerW窗体,设置为Program Manager的儿子,再在此上面播放视频。

自定义窗口程序

打开VS2022创建 [  Qt Widgets Application   ]

这里Base Class(基类)你必须选择Qwidget 

 立即编译运行 ,能正常运行就开始下面步骤 。

鼠标无法拖动窗口

您需要添加额外的代码

1.在头文件添加两个继承的方法和一个私有的数据成员    

#include <qevent.h>

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
private:
 QPoint _Point;

2.实现

   mousePressEvent  // 鼠标按下事件

   

void Wallpaper::mousePressEvent(QMouseEvent* event)
{
    _Point = event->globalPos() - this->pos();
}

  mouseMoveEvent   // 鼠标移动事件

  

void Wallpaper::mouseMoveEvent(QMouseEvent* event)
{
    move(event->globalPos() - _Point);
}

UI布局

 打开

右上角皮肤,设置,最小化 ,关闭

图标文件自行准备,在属性栏添加。

我会把项目发给你们🥝🥝

刷新率选择

60HZ设置固定(因为暂时没有120的方案)

调节音量

 

设置步长1,旁边是标签  设置为0

       

 ------------------------

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>WallpaperClass</class>
 <widget class="QWidget" name="WallpaperClass">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1370</width>
    <height>827</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Wallpaper</string>
  </property>
  <property name="windowIcon">
   <iconset resource="Wallpaper.qrc">
    <normaloff>:/Wallpaper/ico/Wall.png</normaloff>:/Wallpaper/ico/Wall.png</iconset>
  </property>
  <property name="styleSheet">
   <string notr="true"/>
  </property>
  <widget class="Line" name="line">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>40</y>
     <width>1381</width>
     <height>16</height>
    </rect>
   </property>
   <property name="orientation">
    <enum>Qt::Horizontal</enum>
   </property>
  </widget>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>131</width>
     <height>21</height>
    </rect>
   </property>
   <property name="palette">
    <palette>
     <active>
      <colorrole role="WindowText">
       <brush brushstyle="SolidPattern">
        <color alpha="255">
         <red>255</red>
         <green>255</green>
         <blue>255</blue>
        </color>
       </brush>
      </colorrole>
     </active>
     <inactive>
      <colorrole role="WindowText">
       <brush brushstyle="SolidPattern">
        <color alpha="255">
         <red>255</red>
         <green>255</green>
         <blue>255</blue>
        </color>
       </brush>
      </colorrole>
     </inactive>
     <disabled>
      <colorrole role="WindowText">
       <brush brushstyle="SolidPattern">
        <color alpha="255">
         <red>120</red>
         <green>120</green>
         <blue>120</blue>
        </color>
       </brush>
      </colorrole>
     </disabled>
    </palette>
   </property>
   <property name="font">
    <font>
     <family>微软雅黑</family>
     <pointsize>12</pointsize>
    </font>
   </property>
   <property name="text">
    <string>Wallpaper</string>
   </property>
  </widget>
  <widget class="QPushButton" name="closeBtn">
   <property name="geometry">
    <rect>
     <x>1325</x>
     <y>13</y>
     <width>33</width>
     <height>29</height>
    </rect>
   </property>
   <property name="styleSheet">
    <string notr="true">QPushButton#closeBtn:hover{
background-color: rgb(219, 0, 0);
color: rgb(255, 255, 255);
border-radius: 1px;
}</string>
   </property>
   <property name="text">
    <string/>
   </property>
   <property name="icon">
    <iconset resource="Wallpaper.qrc">
     <normaloff>:/Wallpaper/MS/CLOSE.png</normaloff>:/Wallpaper/MS/CLOSE.png</iconset>
   </property>
   <property name="iconSize">
    <size>
     <width>20</width>
     <height>20</height>
    </size>
   </property>
   <property name="flat">
    <bool>true</bool>
   </property>
  </widget>
  <widget class="QPushButton" name="SkinBtn">
   <property name="geometry">
    <rect>
     <x>1200</x>
     <y>11</y>
     <width>37</width>
     <height>33</height>
    </rect>
   </property>
   <property name="toolTip">
    <string>更换主题</string>
   </property>
   <property name="statusTip">
    <string/>
   </property>
   <property name="styleSheet">
    <string notr="true">QPushButton#SkinBtn:hover{
background-color: rgb(90, 90,90);
color: rgb(255, 255, 255);
border-radius: 1px;
}</string>
   </property>
   <property name="text">
    <string/>
   </property>
   <property name="icon">
    <iconset resource="Wallpaper.qrc">
     <normaloff>:/Wallpaper/MS/theme.png</normaloff>:/Wallpaper/MS/theme.png</iconset>
   </property>
   <property name="iconSize">
    <size>
     <width>24</width>
     <height>24</height>
    </size>
   </property>
   <property name="flat">
    <bool>true</bool>
   </property>
  </widget>
  <widget class="QPushButton" name="setBtn">
   <property name="geometry">
    <rect>
     <x>1243</x>
     <y>11</y>
     <width>37</width>
     <height>33</height>
    </rect>
   </property>
   <property name="toolTip">
    <string>更多选项</string>
   </property>
   <property name="statusTip">
    <string/>
   </property>
   <property name="styleSheet">
    <string notr="true">QPushButton#setBtn:hover{
background-color: rgb(90, 90,90);
color: rgb(255, 255, 255);
border-radius: 1px;
}</string>
   </property>
   <property name="text">
    <string/>
   </property>
   <property name="icon">

  
...

背景绘制

默认为黑色,点换肤按钮更换

  QString tempBg = ConfigFile->value("ckbg").toString();  //  启动程序看配置文件里的背景文件名
    if (tempBg != "")  // 有就设置
    {
        startBg(tempBg);
    }
    else 
    {
        QPalette pal;
        pal.setColor(QPalette::Background, QColor(46, 46, 46));
        this->setPalette(pal);
    }



void Wallpaper::startBg(QString file)
{
    QPalette pal = this->palette();
    pal.setBrush(QPalette::Background, QBrush(QPixmap(file)));
    setPalette(pal);
}


void Wallpaper::onSkinBtn()   
{
   QString tempFile = QFileDialog::getOpenFileName(this, "选择图片", "", "src(*.jpg *.png *.jpeg)");   // 选择背景图
   ConfigFile->setValue("ckbg", tempFile);   //  写到tempFile下次启动就加载   ini
   startBg(tempFile);  // 设置背景的函数
}

 样式表

qss(样式表)参考了css 但是并不能像css那样炫酷。

为按钮添加样式表:

关闭

QPushButton#closeBtn:hover{   #鼠标浮在上面的效果
background-color: rgb  (219, 0, 0);      
color: rgb(255, 255, 255);
border-radius: 1px;  
}

最小化:

QPushButton#minBtn:hover{
background-color: rgb(90, 90,90);
color: rgb(255, 255, 255);
border-radius: 1px;
}

设置:

QPushButton#setBtn:hover{
background-color: rgb(90, 90,90);
color: rgb(255, 255, 255);
border-radius: 1px;
}

改一下颜色

color: rgb(149, 149, 149)

拉动条    :

 

QSlider::groove:horizontal {
border: 0px solid #bbb;
}

QSlider::sub-page:horizontal {

background: rgb(90,49,255);

border-radius: 2px;

margin-top:8px;

margin-bottom:8px;

}


QSlider::add-page:horizontal {

background: rgb(255,255, 255);
border: 0px solid #777;
border-radius: 2px;
margin-top:9px;

margin-bottom:9px;
}
 
QSlider::handle:horizontal {
background: rgb(193,204,208)
width: 5px;
border: 1px solid rgb(193,204,208);
border-radius: 2px; 
margin-top:6px;
margin-bottom:6px;
}

QSlider::handle:horizontal:hover {

background: rgb(193,204,208);
width: 10px;
border: 1px solid rgb(193,204,208);
border-radius: 5px; 
margin-top:4px;

margin-bottom:4px;
}

基本实现

😎右上角按钮实现

头文件添加槽,在构造函数内进行信号连接。

private slots:
    void onCloseBtn();
    void onMinBtn();
    void onSetBtn();
    void onSkinBtn();

     构造函数内添加

    connect(ui.closeBtn,SIGNAL(clicked()),this,SLOT(onCloseBtn()));
    connect(ui.minBtn, SIGNAL(clicked()), this, SLOT(onMinBtn()));
    connect(ui.setBtn, SIGNAL(clicked()), this, SLOT(onSetBtn()));
    connect(ui.SkinBtn, SIGNAL(clicked()), this, SLOT(onSkinBtn()));

         

 🍉closeBtn:

     

void Wallpaper::onCloseBtn()
{
    hide();   // 隐藏用于托盘显示
   //close();
}

    🍎onMinBtn{ showMinimized();    }    

    🥰onSetBtn { /* 暂不实现  */ }

    🍰onSkinBtn  // 换肤

 QString tempFile = QFileDialog::getOpenFileName(this, "选择图片", "", "src(*.jpg *.png *.jpeg)");   // user选择背景图 
   ConfigFile->setValue("ckbg", tempFile);  // 写 到tempFile下次启动就加载
   startBg(tempFile);   // 设置背景的函数

🍊隐藏到托盘

   使用#include <qsystemtrayicon.h> 实现

   定义数据成员 在头文件 QSystemTrayIcon* systemtrayicon; 

   由于有大量的弹出菜单,我们把弹出菜单的需要的东西封在initSpecific()

    

void Wallpaper::initSpecific()
{
   
    systemtrayicon = new QSystemTrayIcon(QIcon(":/Wallpaper/ico/Wall.png"));
    systemtrayicon->setToolTip(("动态壁纸:运行中"));
    systemtrayicon->show();

    QMenu* tray_Menu = new QMenu(this);
    /*托盘弹出的菜单*/
    QAction* action1 = new QAction("显示主界面");   
    QAction* action2 = new QAction("退出壁纸");
    tray_Menu->setStyleSheet("background-color: rgb(92,92,92);");
    tray_Menu->addAction(action1);
    tray_Menu->addSeparator();
    tray_Menu->addAction(action2);

    systemtrayicon->setContextMenu(tray_Menu);  //   放入

    connect(action1, SIGNAL(triggered(bool)), this, SLOT(onAction1()));  // 注意信号
    connect(action2, SIGNAL(triggered(bool)), this, SLOT(onAction2()));
}

🥰主界面切换

三个按钮

 三按钮槽函数

  private slots:
    void onInstalledBtn();
    void onDiscovBtn();
    void onMoberBtn();
void Wallpaper::onInstalledBtn()
{
    ui.stackedWidget->setCurrentIndex(0);
}

void Wallpaper::onDiscovBtn()
{
    ui.stackedWidget->setCurrentIndex(1);
}

void Wallpaper::onMoberBtn()
{
    ui.stackedWidget->setCurrentIndex(2);
}

// 默认在你设计后停留的页面

🥩拉动条

void Wallpaper::onSliderSetNum(int num)
{
 ui.valuseShow->setText(QString::number(num));  //拉动了就设置旁边的标签
 mediaPlayer->setVolume(num); // 根据标签设置音量    这个mediaPlayer后面会写

}


 connect(ui.vloueQSlider, SIGNAL(valueChanged(int)), SLOT(onSliderSetNum(int)));   // 当进度条拉动  valueChanged发射信号

        

QWebEngine使用

显示网页

#include <QWebEngineView>

// 网址
ui.webEngineView->load(QUrl("https://www.pgyer.com/0uTR"));  

把这个放在界面上

QMedia使用

#include <QMediaPlayer>
#include <QMediaPlaylist>  // 播放列表  用于循环播放
#include <QVideoWidget>  //   播放视频的窗口

 QVideoWidget* videoWidget;
 QMediaPlayer* mediaPlayer;
 QMediaPlaylist* Videolist;

Videolist = new QMediaPlaylist;
mediaPlayer = new  QMediaPlayer;
videoWidget = new QVideoWidget;


谈一谈这个按钮,按下后选择视频,并在桌面显示出来😎

 先来个查找的工具,用于杀死视频窗口,不然释放

QVideoWidget还是会播放。

工具:

#include <Windows.h>

//获取背景窗体句柄
HWND GetBackground() {
    //背景窗体没有窗体名,但是知道它的类名是workerW,且有父窗体Program Maneger,所以只要
    //遍历所有workerW类型的窗体,逐一比较它的父窗体是不是Program Manager就可以找到背景窗体
    HWND hwnd = FindWindowA("progman", "Program Manager");
    HWND worker = NULL;
    do {
        worker = FindWindowExA(NULL, worker, "workerW", NULL); // 根据类名获取窗体句柄
        if (worker != NULL) {
            char buff[200] = { 0 };
            int ret = GetClassNameA(worker, (PCHAR)buff, sizeof(buff) * 2);
            if (ret == 0) {
                return NULL;
            }
        }
        if (GetParent(worker) == hwnd) {
            return worker;//返回结果
        }
    } while (worker != NULL);
    //没有找到
    //发送消息生成一个WorkerW窗体
    SendMessage(hwnd, 0x052C, 0, 0);
    //重复上面步骤
    do {
        worker = FindWindowExA(NULL, worker, "workerW", NULL);
        if (worker != NULL) {
            char buff[200] = { 0 };
            int ret = GetClassNameA(worker, (PCHAR)buff, sizeof(buff) * 2);
            if (ret == 0) {
                return NULL;
            }
        }
        if (GetParent(worker) == hwnd) {
            return worker;//返回结果
        }

        
    } while (worker != NULL);
    return NULL;
}

void SetBackground(HWND child) {
    SetParent(child, GetBackground()); // 把视频窗口设置为Program Manager的儿子
}

🤪按钮的实现

void onGetVideo();  // 槽


connect(ui.getVideo, SIGNAL(clicked()), this, SLOT(onGetVideo())); 

void Wallpaper::onGetVideo()
{   
    if (isPlay == false)  // 判断是否有过视频窗口 
    {

        QString file;
        file = QFileDialog::getOpenFileName(this, "选择图片或视频", "", "src(*.mp4)");

        ConfigFile->setValue("videos", file);   // 写入配置文件
        isPlay = true;  // 现在有了
        showVoide(file);  //  放视频具体操作

    }
    else
    {
        // 不创建窗口模式 直接设置播放列表里面的视频
        mediaPlayer->stop();
        QString file;
        file = QFileDialog::getOpenFileName(this, "选择图片或视频", "", "src(*.mp4)");

        ConfigFile->setValue("videos", file);
        NextVideo(file);  // 启动下一个视频
    }
    
    return;
}

showVoide

void Wallpaper::showVoide(QString Name)
{

    HWND hwnd = (HWND)videoWidget->winId(); //获取播放视频的窗口id
    SetBackground(hwnd);
    videoWidget->setWindowFlags(Qt::FramelessWindowHint); // // 隐藏标题栏
    videoWidget->showFullScreen(); // 最大化显示
/*
   this->windowClose = tempWork;  //获取子窗口id后面用来关闭
   2023年1月29日21:30:01 发现bug 这段代码是直接关了系统背景资源管理器会崩溃
*/ 
    this->windowClose = hwnd;  // 到时候直接杀播放视频的窗口就行了 但会留下壁纸
    
    // mediaPlayer为播放控制器 用于启动播放 Videolist是播放列表
    Videolist->addMedia(QMediaContent(QUrl::fromLocalFile(Name)));// 设置要播放的文件路径
    Videolist->setCurrentIndex(0);
    Videolist->setPlaybackMode(QMediaPlaylist::Loop); // 循环
    mediaPlayer->setVideoOutput(videoWidget); // 设置视频输出窗口
    mediaPlayer->setPlaylist(Videolist);
    mediaPlayer->play();
}

NextVideo

void Wallpaper::NextVideo(QString Name)
{
    Videolist->clear();
    Videolist->addMedia(QMediaContent(QUrl::fromLocalFile(Name)));
    mediaPlayer->play();
}

记忆功能

程序启动时检查配置文件,进行响应的调度 。

QSettings可以提供方便的ini配置操作

#include <QSettings>


QString  GetAPPDATAFolder()
{

    wchar_t path[255] = { 0 };
    SHGetSpecialFolderPath(
        NULL,					
        path,					
        CSIDL_APPDATA,		
        FALSE							
    );
  


   QString rlt = QString::fromWCharArray(path);
   return rlt;
}


QString folder = GetDesktopFolder();  //获取用户数据文件夹 一般配置文件放里面
folder.append("\\Wallpaper_user.ini");

ConfigFile = new QSettings(folder, QSettings::IniFormat);
ConfigFile->beginGroup("USERRCONFIG"); // 节点名

QString tempBg = ConfigFile->value("ckbg").toString();   // 读这个ckbg下的数据
//  ConfigFile->setValue("ckbg", tempFile);   //  写


// 加载上次设置的视频
    QString tempVid = ConfigFile->value("videos").toString();
    if (tempVid != "")
    {
        if (isPlay == false)
        {
            isPlay = true;
            showVoide(tempVid);
        }
    }

应用程序打包

如何在让程序在别的计算机执行

一、使用这个工具        

 找不到用Everything 搜。

选Release 和 x64 编译

 打开终端程序,进入程序所在目录

 输入  

windeployqt D:\local\Wallpaper.exe

会自动加载所需。

二、Enigma Virtual Box

虚拟目录

使一些dll和其他文件隐藏,只有exe程序。

---------------------------------------------------------

由于没有使用MD编辑文章,观感可能不舒服,请见谅。

有问题私信

------------------------------------------------------------

源代码:

链接:https://pan.baidu.com/s/1-HUPkdniFPPHUJ2B8AC0wQ?pwd=sjfd 
提取码:sjfd

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

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

相关文章

四年巨亏49亿,第四范式四闯IPO

深陷亏损的AI公司第四范式&#xff0c;四闯IPO&#xff01; 4月24日&#xff0c;决策类AI独角兽北京第四范式智能技术股份有限公司&#xff08;下称“第四范式”&#xff09;再次更新招股书&#xff0c;继续向港交所发起上市冲击。 第四范式是一家专注于提供以平台为中心的人…

(9) 线性回归

文章目录 1 多元线性回归LinearRegression1.1 基本原理1.2 linear_model.LinearRegression 2 回归类的模型评估指标2.1 是否预测了正确的数值2.2 是否拟合了足够的信息 3 岭回归与Lasso回归3.1 多重共线性3.2 岭回归3.2.1 linear_model.Ridge3.2.2 选取最佳的正则化参数 α \al…

车载以太网-FlexRay

摘要&#xff1a; 到底什么是FlexRay&#xff1f; 1. FlexRay是什么&#xff1f; 那么到底什么是FlexRay&#xff1f;往简单了说&#xff0c;就是CAN总线加LIN总线混合起来排个课程表、提个速再加个冗余。像LIN一样基于TDMA&#xff0c;提高了协议的复杂度&#xff0c;拥有静态…

【linux】挖矿病毒nanominer伪装成python占用服务器GPU的查杀记录

病毒表现 gpustat -cpu 可以看到root用户将GPU的核心跑满了每个占用都是100%&#xff0c;显存吃了6G多。 nvidia-smi 不能正常显示GPU被哪些进程占用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/780f90080a084a44ac59227e384f985b.png 病毒文件分析 在/tmp/.x/…

win10 vmware虚拟机蓝屏怎么办 win10 vmware虚拟机蓝屏解决方法【详解】

最近有朋友出现win10 vmware虚拟机蓝屏的情况应该怎么办&#xff1f;小伙伴们在使用vmware虚拟机出现了蓝屏现象的小伙伴们不用担心&#xff0c;小编翻阅各种资料后给大家带来两种虚拟机蓝屏的解决方法&#xff0c;想要解决此问题的小伙伴们快跟着小编往下看吧&#xff01; win…

三分钟看懂JDK、JRE和JVM的区别和联系

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) JVM Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同…

腾讯云轻量应用服务器卡死怎么连接?

腾讯云轻量云服务器卡死怎么解决&#xff1f;使用腾讯云自带的VNC登录连接轻量服务器&#xff0c;或使用腾讯云OrcaTerm一键免密登录轻量实例。如果是确定数据没问题&#xff0c;也可以使用控制台自带的重启实例。 腾讯云轻量应用服务器参考&#xff1a;https://curl.qcloud.co…

5月18号软件资讯更新合集.....

JTopCMS V4 更新&#xff1a;静态发布功能优化 适配版本&#xff1a;V4.6 介绍 &#xff1a; 本次更新对静态发布 HTML 功能进行多个重要优化&#xff0c;支持全站增量模式发布&#xff0c;支持跨站级栏目联动发布&#xff0c;增加定时发布指定栏目范围&#xff0c;增加栏目对…

php对接阿里云API调用企业税号查询的高级实战案例解析(下拉筛选查询、远程调用API、xm-select组件应用)

阿里云API调用企业税号查询 一、功能描述1.请求参数2.GET请求代码3.返回示例4.错误码 二、核心代码1.引入外部JS库2.构建HTML容器3.xmSelect回调 总结 一、功能描述 企业税号查询-公司税号查询-企业公司开票信息查询-企业营业执照信息查询-工商信息查询-企业基本信息查询&…

【ROS】ROS1编程速览

1、简述 很多项目已经转向ROS2&#xff0c;本人作为ROS小白从ROS1开始学起&#xff0c;但是不会深入学习ROS1&#xff0c;只一带而过。 下面只了解一些ROS1中的概念和基本编程接口。 ROS1中有两种通信模式&#xff1a;话题模式和服务模式&#xff0c;区别如下 2、话题模式 …

分享一份适合练手的软件测试实战项目,涵盖金融,电商,银行,商城,家政项目

现如今&#xff0c;越来越多的人涌入到测试行业来了&#xff0c;有自学的&#xff0c;有通过参加培训转行的&#xff0c;不管通过何种方式&#xff0c;他们面临的最主要的问题就是&#xff1a; 1、简历上的项目经验如何去编造&#xff1f; 2、入职的背调、薪资流水、离职证明等…

涨点神器:CVPR2023 InceptionNeXt当Inception遇见ConvNeXt,在Yolov8即插即用,小目标检测涨点明显

论文地址: https://arxiv.org/pdf/2303.16900.pdf 代码: GitHub - sail-sg/inceptionnext: InceptionNeXt: When Inception Meets ConvNeXt 单位:NUS, Sea AI Lab(颜水成等人) 1. InceptionNeXt介绍 摘要:受ViT的 long-range 建模能力的启发,大核卷积来扩大感受野用于…

Nvivo12 mac code comparison编码比较查询:软件操作步骤

编码比较查询步骤 1.合并项目2.编码比较2.1 选择不同的编码人2.1.1 比较单元 2.2-2.4 选择比较项目2.5 显示比较内容 3.结果kappa的解读4.参考资源 1.合并项目 如果两个编码人是在同一个项目文件中编码的&#xff08;你编一遍&#xff0c;我编一遍&#xff09;&#xff0c;此步…

Oracle 扩展统计信息收集 extension statistics

1.扩展统计信息的收集,可以用select dbms_stats.create_extended_stats(scott,test01,(object_name,object_type))from dual 创建扩展统计列,然后dbms_stats.gather_table_stats(scott,test01)收集统计信息,也可以直接在 dbms_stats.gather_table_stats中的method_opt属性同时…

【黑马笔记】IDEA配置Tomcat

文章目录 1. 配置Tomcat-本地部署1.1 官网下载tomcat压缩包1.2 idea配置tomcat1.2.1 本地tomcat查询1.2.2 部署项目 2. 配置Tomcat-插件部署 1. 配置Tomcat-本地部署 1.1 官网下载tomcat压缩包 https://tomcat.apache.org/ 解压Tomcat 1.2 idea配置tomcat 1.2.1 本地tomc…

DELL戴尔笔记本电脑成就Vostro 5620原装出厂Windows11系统恢复原厂OEM专用系统

DELL戴尔笔记本电脑成就Vostro 5620原装出厂Windows11系统恢复原厂OEM专用系统 系统自带所有驱动、办公软件、MyDell、迈克菲等预装程序 链接&#xff1a;https://pan.baidu.com/s/16AKSsMRTzYXQ_AX_Eti22w?pwdazx8 提取码&#xff1a;azx8

一文熟悉广汽埃安的EV+ICV进展

摘要&#xff1a; 本期带大家走进广汽埃安&#xff0c;了解了解埃安使用的紧密相关的那些技术或产品。 2017年&#xff0c;广汽新能源成立&#xff0c;并在2020年更名为广汽埃安新能源汽车有限公司&#xff1b;2022年&#xff0c;广汽埃安产销量 跃至国内第三&#xff0c;业绩…

C++实现开散列/链地址法

前言 解决哈希冲突的方法有闭散列和开散列&#xff0c;上篇博客C实现闭散列已经讲解完了闭散列的实现方式 本篇博客实现开散列/连地址法的哈希表 文章目录 前言一. 开散列二. 开散列实现(1). 结构(2). 插入(3). 查找(4). 删除(5). 析构函数 三. 完整代码结束语 一. 开散列 开…

RocketMQ JVM/OS配置与订阅关系一致

一、JVM/OS配置 1 、JVM选项​ 推荐使用最新发布的 JDK 版本。通过设置相同的 Xms 和 Xmx 值来防止 JVM 调整堆大小以获得更好的性能。生产环境 JVM 配置如下所示&#xff1a; -server -Xms8g -Xmx8g -Xmn4g 当 JVM 是默认 8 字节对齐&#xff0c;建议配置最大堆内存不要超过…

AI加持的必应,为什么还赢不了谷歌?

“少年屠龙”的故事&#xff0c;似乎还有些遥远。 即使有新必应的加成&#xff0c;微软浏览器Edge在全球市场的占有率依然不高。据Statcounter数据显示&#xff0c;2023年4月&#xff0c;Edge的市场占有率仅为4.97%。提升的速度似乎也不太理想&#xff0c;4月份的数据只比一年…