当前位置: 首页 > news >正文

Qt图片定时滚动播放器+透明过渡动画

目录

  • 参考
    • 结构
    • PicturePlay.pro
    • main.cpp
    • myqlabel.h 自定义QLabel
    • myqlabel.cpp自定义QLabel
    • pictureplay.h
    • pictureplay.cpp
    • pictureplay.ui
  • style.qss
  • 效果
  • 源码

参考

Qt图片浏览器

QT制作一个图片播放器

Qt中自适应的label+pixmap充满窗口后,无法缩小只能放大

Qt的动画类修改透明度来实现上下两张图片的切换效果

解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1]

可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开文件选择,定时滚动图片

重载实现dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口大小改变)

解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1] 需要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() ,所以本项目 需要使用自定义的MyQLabel继承QLabel

没有透明过渡动画版本Qt图片定时滚动播放器,没有透明过渡动画

结构

在这里插入图片描述

PicturePlay.pro

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \myqlabel.cpp \pictureplay.cppHEADERS += \myqlabel.h \pictureplay.hFORMS += \pictureplay.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \res.qrc

main.cpp

#include "pictureplay.h"#include <QApplication>
#include<QFile>
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 加载样式文件QFile file(":/style.qss");/*判断文件是否存在*/if(file.exists()){file.open(QFile::ReadOnly);// 以只读的方式打开//QString styleSheet=QLatin1String(file.readAll());// 以Latin-1编码的字符串的方式保存读出的结果QString styleSheet=QString(file.readAll());// 以默认编码的字符串的方式保存读出的结果qApp->setStyleSheet(styleSheet);// 设置全局样式file.close();// 关闭文件}//在窗口显示前判断使用PicturePlay w;w.show();return a.exec();
}

myqlabel.h 自定义QLabel

#ifndef MYQLABEL_H
#define MYQLABEL_H#include <QWidget>
#include <QLabel>
#include <QPainter>
#include <QPropertyAnimation>class MyQLabel : public QLabel
{Q_OBJECT
public:explicit MyQLabel(QWidget *parent = nullptr);void paintEvent(QPaintEvent *event)override;// 绘图事件;// 图片切换动画类;QPropertyAnimation* m_opacityAnimation;QPixmap currentPixmap;QPixmap nextPixmap;bool paintEvent_Flag;
signals:};#endif // MYQLABEL_H

myqlabel.cpp自定义QLabel

#include "myqlabel.h"
#include<QVariant>
#include<QDebug>
MyQLabel::MyQLabel(QWidget *parent) : QLabel(parent)
{this->setProperty("ImageOpacity",1.0);this->paintEvent_Flag=false;// 动画切换类;m_opacityAnimation = new QPropertyAnimation(this, "ImageOpacity");// 这里要设置的动画时间小于图片切换时间;m_opacityAnimation->setDuration(1500);// 设置ImageOpacity属性值的变化范围;m_opacityAnimation->setStartValue(1.0);m_opacityAnimation->setEndValue(0.0);// 透明度变化及时更新绘图;connect(m_opacityAnimation, SIGNAL(valueChanged(const QVariant&)),this, SLOT(update()));m_opacityAnimation->stop();
}
int i=0;
void MyQLabel::paintEvent(QPaintEvent *event)
{if(!currentPixmap.isNull()&&!nextPixmap.isNull()&&paintEvent_Flag){this->clear();QPainter painter(this);QRect imageRect = this->rect();float imageOpacity = this->property("ImageOpacity").toFloat();//qDebug()<<"i=["<<i++<<"]imageOpacity="<<imageOpacity;painter.setOpacity(1);painter.drawPixmap(imageRect, nextPixmap.scaled(imageRect.size()));painter.setOpacity(imageOpacity);painter.drawPixmap(imageRect, currentPixmap.scaled(imageRect.size()));// 透明度减到0}QLabel::paintEvent(event);
}

pictureplay.h

#ifndef PICTUREPLAY_H
#define PICTUREPLAY_H#include <QWidget>
#include <QFile>
#include <QDir>
#include <QTimer>
#include <QThread>
#include <QFileDialog>
#include <QScrollArea>
#include <QPropertyAnimation>
QT_BEGIN_NAMESPACE
namespace Ui { class PicturePlay; }
QT_END_NAMESPACEclass PicturePlay : public QWidget
{Q_OBJECTpublic:PicturePlay(QWidget *parent = nullptr);~PicturePlay();
private slots:void myautoPhoto(); //自动播放函数void showDinamicPhoto(QString path);//动态图播放(格式为gif)void on_pathBtn_clicked();//浏览:打开目录void on_autoPhoto_clicked(bool checked);//自动播放选择void on_photoList_clicked(const QModelIndex &index);//单击播放图片void my_currentRowChanged(int Row);// // 当前项变化void on_cleanBtn_clicked();//清除private:QString Dir;//打开文件的路径QString tempDir; //照片的绝地路径QVector<QString> photoPath;//存放照片相对路径的容器QTimer *mtime; //定时器QString delayTime; //延时间隔bool autoFlag; //判断是否进入的自动播放格式int num; // 当前显示图片index;// 如果文件的后缀名是jpg、jpeg、bmp或png,则接受拖放事件,否则忽略拖放事件QStringList acceptedFileTypes;void dragEnterEvent(QDragEnterEvent *event)override;//拖进事件void dropEvent(QDropEvent *event)override;// 拖进放下事件void resizeEvent(QResizeEvent *event)override;//用于在窗口大小改变时处理事件void paintEvent(QPaintEvent *event)override;// 绘图事件;// 切换图片;QPixmap pixmap;
//    QPixmap currentPixmap;
//    QPixmap nextPixmap;// 用来做图片切换滑动效果,目前以透明度作为切换效果;QScrollArea* m_imagePlayWidget;
//    // 图片切换动画类;
//    QPropertyAnimation* m_opacityAnimation;private:Ui::PicturePlay *ui;
};
#endif // PICTUREPLAY_H

pictureplay.cpp

#include "pictureplay.h"
#include "ui_pictureplay.h"
#include<QDebug>
#include<QMessageBox>
#include<QMovie>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QPainter>PicturePlay::PicturePlay(QWidget *parent): QWidget(parent), ui(new Ui::PicturePlay)
{ui->setupUi(this);this->setWindowTitle("图片播放器");this->setWindowIcon(QIcon(":/ImageEye.jpg"));this->setAcceptDrops(true);//设置允许向窗口拖入图片this->setMinimumSize(QSize(400,300));// 设置最小值ui->photoShow->setAlignment(Qt::AlignCenter);  //居中显示//自适应的label+pixmap充满窗口后,无法缩小只能放大ui->photoShow->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);// Ignored忽略// 内容是否自动缩放,参数true自动缩放ui->photoShow->setScaledContents(true);//显示图片的全部// 设置拉伸因子(默认缩到最小时失效:一样大小)ui->horizontalLayout_2->setStretch(1,3);//  设置水平布局控件到边框距离(左,上,右,下)ui->horizontalLayout_2->setContentsMargins(5,0,5,0);//设置窗口布局,(此时控件会随窗口缩放)this->setLayout(ui->horizontalLayout_2);ui->photoPath->setFocusPolicy(Qt::NoFocus);//无法获得焦点,自然无法输入,其他文本控件类似ui->photoPath->setPlaceholderText("绝对路径");ui->delayEdit->setPlaceholderText("秒");//不显示行向滚动条,子项文本过长自动显示...ui->photoList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);num=0; //照片张数delayTime.clear(); //延时间隔mtime = new QTimer(this);//连接自动播放槽函数connect(mtime,SIGNAL(timeout()),this,SLOT(myautoPhoto()));connect(ui->photoList,SIGNAL(currentRowChanged(int)),this,SLOT(my_currentRowChanged(int)));// 如果文件的后缀名是jpg、jpeg、bmp或png,则接受拖放事件,否则忽略拖放事件acceptedFileTypes.append("jpg");acceptedFileTypes.append("jpeg");acceptedFileTypes.append("bmp");acceptedFileTypes.append("png");acceptedFileTypes.append("gif");}PicturePlay::~PicturePlay()
{delete ui;
}
//自动播放函数
void PicturePlay::myautoPhoto()
{tempDir.clear();tempDir=photoPath.at(num); //从容器中找到要播放的照片的相对路径ui->photoList->setCurrentRow(num);// QListWidget项跳动if(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif")){showDinamicPhoto(tempDir);num++;}else if(!(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif"))){ui->photoShow->paintEvent_Flag=true;ui->photoShow->currentPixmap=pixmap;// 1.先赋值pixmap.load(tempDir);// 2.再更新全局图片// 先设置下一个的图片;ui->photoShow->nextPixmap=pixmap;//3.最后需要立即显示的图片// 动画类重新开始;ui->photoShow->m_opacityAnimation->start();//判断自动播放的时候是否播放到了最后一张图片,如果是则停止自动播放if(num ==  (photoPath.count()-1)){//qDebug()<<num;if(ui->loopPlayback->checkState()==Qt::Checked)//循环重放{num = -1;// 下面num++,为了循环重放回到第一张图片qDebug()<<num;}else{mtime->stop();num = 0;if(autoFlag)//选中自动播放的情况{autoFlag = false;}//qDebug()<<num;ui->autoPhoto->setCheckState(Qt::Unchecked);//把自动播放按钮置于没有选择的状态}}if(autoFlag){num++;}}
}
//动态图播放(格式为gif)
void PicturePlay::showDinamicPhoto(QString path)
{ui->photoShow->clear();ui->photoShow->paintEvent_Flag=false;QMovie *movie = new QMovie(path);  // path图片路径movie->start(); //开始播放动态图ui->photoShow->setMovie(movie); //将图片设置为为动态ui->photoShow->setScaledContents(true); //尽可能完整的播放整张动图 ,此处要设置为true
}//浏览:打开目录
void PicturePlay::on_pathBtn_clicked()
{Dir = QFileDialog::getExistingDirectory(this);//获取本文件所在的具体路径//qDebug()<<"路径:"<<Dir;ui->photoPath->setText(Dir);//显示打开的文件的具体路径QDir dir(Dir);QStringList file;QFileInfoList fileList = dir.entryInfoList(file,QDir::Files); //获取目录下的文件QString fileDir; //保存图片所在的路径//列出目录下的文件for(int i=0;i<fileList.count();i++){if(i==50){break;}QFileInfo info = fileList.at(i);fileDir.clear();if(info.fileName() == "." || info.fileName() == "..") //跳过这两个目录{continue;}// 检查文件的后缀名是否在接受的文件类型列表中;(获取文件的后缀名,并将其转换为小写字母)if(!acceptedFileTypes.contains(info.suffix().toLower())){continue;}fileDir+=Dir + "/";QString filename = info.fileName();fileDir+=filename;photoPath.append(fileDir);// 把图片的路径装到容器中QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件缩小图标item->setToolTip(info.fileName());// tip提示item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置ui->photoList->addItem(item);//把图片相对路径显示到窗口中}if(ui->photoList->count()==0){QListWidgetItem *item = new QListWidgetItem("无合适图片");item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置ui->photoList->addItem(item);//把图片相对路径显示到窗口中}
}//自动播放选择
void PicturePlay::on_autoPhoto_clicked(bool checked)
{if(ui->delayEdit->text().isEmpty()){QMessageBox::warning(this,"提示","请输入需要间隔的播放时间(秒)");//把按钮重新置于没有被选中的状态;不要用setCheckable()函数[不可用],很容易出错ui->autoPhoto->setCheckState(Qt::Unchecked);return;}else if(ui->photoList->count() == 0){QMessageBox::warning(this,"警告","还没有可以播放的图片");ui->autoPhoto->setCheckState(Qt::Unchecked); //把按钮重新置于没有被选中的状态return;}else if(ui->delayEdit->text().toInt()<2)// 图片切换时间大于动画时间{QMessageBox::warning(this,"警告","请输入间隔的播放时间大于等于 2 (秒)");ui->autoPhoto->setCheckState(Qt::Unchecked); //把按钮重新置于没有被选中的状态return;}else if(checked) //启动定时器{delayTime = ui->delayEdit->text();mtime->start(delayTime.toInt()*1000);//启动定时器并设置播放时间间隔autoFlag = true;// 选中自动播放// 第一次:立即显示,无需等待ui->photoList->setCurrentRow(num);// QListWidget项跳动pixmap.load(photoPath.at(num));// 先更新全局图片ui->photoShow->paintEvent_Flag=true;ui->photoShow->currentPixmap=ui->photoShow->nextPixmap=pixmap;//再赋值update();//  手动刷新}else if(!checked)//停止定时器{mtime->stop();//停止定时器delayTime.clear();autoFlag = false;ui->photoShow->paintEvent_Flag=false;}
}//单击播放图片
void PicturePlay::on_photoList_clicked(const QModelIndex &index)
{qDebug()<<"单击播放图片";Q_UNUSED(index);//忽略编译器发出的警告,表明变量event未使用//如果选中了自动播放的情况下,点击列表中的内容,则停止自动播放if(autoFlag) //选中自动播放的情况{mtime->stop();//把按钮重新置于没有被选中的状态;不要用setCheckable()函数[不可用],很容易出错ui->autoPhoto->setCheckState(Qt::Unchecked);autoFlag = false;}num = ui->photoList->row(ui->photoList->currentItem()); //获取当前点击的内容的行号//在没有选中自动播放的情况下,判断当前是否点击了最后一张照片,如果是最后一张照片,在选中自动播放的情况下让它返回到第一张照片if(!autoFlag&&num == ui->photoList->count()){num = 0;}tempDir.clear();/*tempDir+=Dir+"/";QString path = ui->photoList->currentItem()->text();tempDir+=path*/;tempDir=photoPath.at(num); //从容器中找到要播放的照片的相对路径//判断是否是动态图;endsWith()字符串结尾if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif")){showDinamicPhoto(tempDir);}else{pixmap.load(tempDir);// 更新全局图片ui->photoShow->paintEvent_Flag=true;ui->photoShow->currentPixmap=ui->photoShow->nextPixmap=pixmap;update();//  手动刷新}
}
// 当前项变化
void PicturePlay::my_currentRowChanged(int Row)
{qDebug()<<"当前项变化:"<<Row;
}
//拖进事件
void PicturePlay::dragEnterEvent(QDragEnterEvent *event)
{// 用于检查拖放的数据是否包含URL,并且获取拖放事件中的URL数量==1if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){// 获取拖放事件中的第一个URL的本地文件路径QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());// 检查文件的后缀名是否在接受的文件类型列表中;(获取文件的后缀名,并将其转换为小写字母)if(acceptedFileTypes.contains(file.suffix().toLower())){event->acceptProposedAction();//表明用户可以在窗口部件上拖放对象[接受拖放事件的操作]}}
}
// 拖进放下事件
void PicturePlay::dropEvent(QDropEvent *event)
{// 获取拖放事件中的第一个URL的本地文件路径QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());//qDebug()<<"绝对路径:"<<file.absoluteFilePath();//从文件中加载图片,参数file.absoluteFilePath()表示包含文件名的绝对路径,load()返回一个bool值,表示是否加载成功if(pixmap.load(file.absoluteFilePath())){ui->photoShow->paintEvent_Flag=true;ui->photoShow->currentPixmap=ui->photoShow->nextPixmap=pixmap;update();//  手动刷新,否则鼠标拖进放下,如果鼠标不在窗口不会刷新,图片不会显示ui->photoPath->setText(file.absolutePath());//显示打开的文件的绝对路径,这不包括文件名。photoPath.append(file.absoluteFilePath());// 把图片的路径装到容器中QListWidgetItem *item = new QListWidgetItem(QIcon(file.absoluteFilePath()),file.fileName());//建立文件缩小图标item->setToolTip(file.fileName());// tip提示item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置ui->photoList->addItem(item);//把图片相对路径显示到窗口中}else{// 错误消息框QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));}
}
//用于在窗口大小改变时处理事件
int j=0;
void PicturePlay::resizeEvent(QResizeEvent *event)
{Q_UNUSED(event);//忽略编译器发出的警告,表明变量event未使用qDebug()<<"窗口大小改变:"<<j++;if(!pixmap.isNull()){// 在MyQLaBel的paintEvent绘图事件,会重绘//ui->photoShow->setPixmap(pixmap.scaled(ui->photoShow->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));}
}
//绘图事件
void PicturePlay::paintEvent(QPaintEvent *event)
{//QPainter painter(ui->photoShow);/*报错QWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1*///想要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() 方法才行。//比如想要在 QLabel 上绘图,就需要新建一个类继承于 QLabel,然后重写 paintEvent() 方法//也就是在此文件只能用QPainter painter(this);Q_UNUSED(event);//忽略编译器发出的警告,表明变量event未使用
}
// 清除
void PicturePlay::on_cleanBtn_clicked()
{mtime->stop();num = 0;if(autoFlag)//选中自动播放的情况{autoFlag = false;}pixmap.fill(Qt::transparent);//函数用于将QPixmap对象pixmap清空,参数Qt::transparent表示填充透明色,无返回值ui->autoPhoto->setCheckState(Qt::Unchecked);//把自动播放按钮置于没有选择的状态ui->loopPlayback->setCheckState(Qt::Unchecked);//把循环重放钮置于没有选择的状态photoPath.clear();ui->photoPath->clear();ui->photoList->clear();ui->photoShow->clear();ui->photoShow->nextPixmap=ui->photoShow->currentPixmap=pixmap;ui->photoShow->paintEvent_Flag=false;}

pictureplay.ui

在这里插入图片描述

style.qss

QListWidget
{border:1px solid gray;  /*边界线:宽度、颜色*//*background:gray;*/    /*表格背景色*/color:black;        /*前景色:文字颜色*//*margin:5px,5px,0px,50px;*/   /*上、下、左、右,间距*/
}
QListWidget{ /*去掉选中时的虚线框*/outline:0px;
}
QListWidget::item
{padding-top:12px;padding-bottom:4px;
}
QListWidget::item:hover/*悬停*/
{show-decoration-selected:5;background:skyblue;/*天蓝色*/
}
QListWidget::item:selected
{/*border:0px;*/background:lightgray;/*浅灰色*/padding:0px;margin:0px;color:red;
}
/*上次选择后保留的状态,鼠标离开后显示*/
QListWidget::item:selected:!active
{border:none;/*无边框*/background:lightgreen;/*浅绿色*/
}

效果

  • 启动
    在这里插入图片描述
  • 运行
    在这里插入图片描述

在这里插入图片描述

源码

有道云:Qt图片定时滚动播放器

相关文章:

Qt图片定时滚动播放器+透明过渡动画

目录参考结构PicturePlay.promain.cppmyqlabel.h 自定义QLabelmyqlabel.cpp自定义QLabelpictureplay.hpictureplay.cpppictureplay.uistyle.qss效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后&#xff0c;无法缩小只能放大 Qt的动画类修改…...

手把手带你做一套毕业设计-征程开启

本文是《手把手带你做一套毕业设计》专栏的开篇&#xff0c;文本将会包含我们创作这个专栏的初衷&#xff0c;专栏的主体内容&#xff0c;以及我们专栏的后续规划。关于这套毕业设计的作者呢前端部分由狗哥负责&#xff0c;服务端部分则由天哥操刀。我们力求毕业生或者新手通过…...

万字解析 Linux 中 CPU 利用率是如何算出来的?

在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单&#xff0c;说复杂也不是那么容易就能全部搞明白…...

芯驰(E3-gateway)开发板环境搭建

1-Windows下环境配置 可以在Windows上使用命令行或者IAR IDE编译SSDK项目。Windows编译依赖的工具已经包含在 prebuilts/windows 目录中&#xff0c;包括编译器、Python和命令行工具。 1.1.1 CMD SSDK集成 msys 工具&#xff0c;可以在Windows命令行中完成SDK的配置、编译和…...

HiveSql一天一个小技巧:如何巧用分布函数percent_rank()求去掉最大最小值的平均薪水问题

0 问题描述参考链接(3条消息) HiveSql面试题12--如何分析去掉最大最小值的平均薪水&#xff08;字节跳动&#xff09;_莫叫石榴姐的博客-CSDN博客文中已经给出了三种解法&#xff0c;这里我们借助于此题&#xff0c;来研究如何用percent_rank()函数求解&#xff0c;简化解题思路…...

【python实现华为OD机试真题】优雅子数组【2023 Q1 | 200分】

题目描述 如果一个数组Q中出现次数最多的元素出现大于等于K次,被称为k-优雅数组,k也可以被称为优雅阈值只。 例如: 数组1,2, 3, 1、2, 3, 1,它是一个3-优雅数组,因为元素1出现次数大于等于3次, 数组[1,2, 3, 1, 2]就不是一一个3-优雅数组,因为其中出现次数最多的元素是1和…...

九种分布式ID解决方案

文章目录背景1、UUID2、数据库自增ID2.1、主键表2.2、ID自增步长设置3、号段模式4、Redis INCR5、雪花算法6、美团(Leaf)7、百度(Uidgenerator)8、滴滴(TinyID)总结比较背景 在复杂的分布式系统中&#xff0c;往往需要对大量的数据进行唯一标识&#xff0c;比如在对一个订单表…...

RocketMQ源码分析

RocketMQ源码深入剖析 1 RocketMQ介绍 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术&#xff0c;自主研发的云正式商用的专业消息中间件&#xff0c;既可为分布式应用系统提供异步解耦和削峰填谷的能力&#xff0c;同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠…...

跟着我从零开始入门FPGA(一周入门系列)第六天

6、有限状态机状态机&#xff0c;只要C代码写过2年的人&#xff0c;估计无人不识君&#xff0c;稍微复杂的逻辑都可以借助状态机来简化问题。为了方便&#xff0c;我们使用前面用过的一个例子&#xff0c;来说明状态机的应用&#xff0c;也就是说我们前面已经有意无意的用过状态…...

2023最新JVM面试题汇总进大厂必备

JVM 面试题汇总 1.什么是 JVM&#xff1f;它有什么作用&#xff1f; 答&#xff1a;JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写&#xff0c;顾名思义它是一个虚 拟计算机&#xff0c;也是 Java 程序能够实现跨平台的基础。它的作用是加载 Java 程…...

Cocoa-presentViewController

presentViewController:animator: 将一个viewController以动画方式显示出来 当VCA模态的弹出了VCB&#xff0c;那么VCA就是presenting view controller&#xff0c;VCB就是presented view controller presentViewController 相较于addSubView 直接作为subView就是不会出现一…...

Vue Mixins

Vue Mixins 详解 Vue.js 是一个非常流行的 JavaScript 框架&#xff0c;它提供了一系列的工具来简化 Web 应用程序的开发。其中一个非常有用的工具就是 Mixins。 什么是 Mixins&#xff1f; Mixins 是一种 Vue.js 组件复用的方法&#xff0c;它允许您将一组组件选项合并到一…...

Django-版本信息介绍-版本选择

文章目录1.如何获取Django1.1.选项1:获取最新的正式版本1.2.选项2:获取4.2的beta版1.3.选项3:获取最新的开发版本2.得到之后3.支持版本4.选择版本1.如何获取Django Django在BSD许可下是开源的。我们建议使用最新版本的Python 3。支持Python 2.7的最新版本是Django 1.11 LTS。请…...

写给交互设计新手的信息架构全方位指南

目录什么是信息架构&#xff1f;通用方法日常工作可以关注的大神常用工具相关书籍什么是信息架构&#xff1f;信息架构是一个比众多其他领域更难定义的领域。内容策划由内容策划师来完成&#xff0c;交互设计由设计师来完成&#xff0c;而信息架构的完成与它们不同&#xff0c;…...

15、主从复制,gtid,并行复制,半同步复制,实操案例,常用命令,故障处理

主从复制,gtid,并行复制,半同步复制,实操案例,常用命令,故障处理 1.认识主从复制1.1 主从复制原理深入讲解1.2 主从复制相关参数1.3.主从复制架构部署1.4从库状态详解1.5 .过滤复制2 .gtid复制2.1 什么是GTID?2.2 GTID主从配置2.5 gtid维护2.4 GTID的特点2.3 工作原理2.4 g…...

【C语言】实现文件内容映射转移

有两个文件&#xff08;QA&#xff0c;与QB&#xff09;。 文件A是经过了字母映射加密的文本&#xff08;将英文字母一一映射成了另一个&#xff09;&#xff0c; 文件B是字母映射的关系表&#xff08;格式如A-c;B-R;…,其中前一个字母为加密前的&#xff09;&#xff0c;编写程…...

html css输入框获得焦点、失去焦点效果

input输入框获得焦点、失去焦点效果 废话shao shuo ! 直接看效果图&#xff0c;好吧&#xff01; 效果图&#xff1a; code: <!DOCTYPE html> <html> <head><title></title><meta charset"utf-8" /><style type"text…...

Spark Streaming

第1章 SparkStreaming 概述1.1 Spark Streaming 是什么Spark 流使得构建可扩展的容错流应用程序变得更加容易。**Spark Streaming 用于流式数据的处理。**Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字…...

[kubernetes]-k8s通过psp限制nvidia-plugin插件的使用

导语&#xff1a; k8s通过psp限制nvidia-plugin插件的使用。刚开始接触psp 记录一下 后续投入生产测试了再完善。 通过apiserver开启psp 静态pod会自动更新 # PSP(Pod Security Policy) 在默认情况下并不会开启。通过将PodSecurityPolicy关键词添加到 --enbale-admission-plu…...

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化

简单易懂又非常牛逼的Spring源码解析&#xff0c;推断构造与bean的实例化原理解析实例化bean的入口工厂方法实例化推断构造初次筛选二次筛选bean的实例化代码走读实例化bean的入口createBeanInstance方法内部的流程推断构造初次筛选二次筛选bean的实例化总结往期文章&#xff1…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...