Qt界面中的子窗口实现鼠标拖动边缘改变大小以及移动(完整demo代码)

目录

效果

拖拽

移动​编辑

实现

 DragResizeWgt类.h文件

DragResizeWgt类.cpp文件 

使用

 testwidget窗口.ui文件

testwidget窗口.h文件

testwidget窗口.cpp文件

参考


效果

想要的效果就是类似于QT IDE中的效果,可以拖动边缘改变大小,用户自身可以调整一些窗口的布局,方便使用,如下所示:

demo完成后,经测试达到的效果,如下所示:

拖拽

移动

如果你想要的是这样的效果,无需多言,上代码。

实现

这是一个自定义的窗口类,需要重写窗口的一些函数,如下所示:

    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

 DragResizeWgt类.h文件

#ifndef DRAGRESIZEWGT_H
#define DRAGRESIZEWGT_H#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
#include <QScreen>
#include <QPainter>
#include <QResizeEvent>
#include <QEvent>
namespace Ui {
class DragResizeWgt;
}class DragResizeWgt : public QWidget
{Q_OBJECTenum DIRECTION{nodir,top = 0x01,bottom = 0x02,left = 0x04,right = 0x08,topLeft = 0x01 | 0x04,topRight = 0x01 | 0x08,bottomLeft = 0x02 | 0x04,bottomRight = 0x02 | 0x08};
public:explicit DragResizeWgt(QWidget *parent = nullptr);~DragResizeWgt();
signals:void sizeChange();
public:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void paintEvent(QPaintEvent *event);void resizeEvent(QResizeEvent *event);bool eventFilter(QObject *watch, QEvent *event);void setEdgeBeReSized(const bool& resizeableTop, const bool& resizeableBottom, const bool& resizeableRight, const bool& resizeableLeft);void setIsRepositioning(const bool& reposition);
private:void checkEdge();
private:Ui::DragResizeWgt *ui;QPoint m_startCursor;int m_nLeftOff = 0;//鼠标开始拖拽时子窗口左边相对父窗口左边的距离int m_nRightOff = 0;//鼠标开始拖拽时子窗口右边相对父窗口左边的距离int m_nTopOff = 0;//鼠标开始拖拽时子窗口上边相对父窗口上边的距离int m_nBottomOff = 0;//鼠标开始拖拽时子窗口下边相对父窗口上边的距离QPoint dragPosition;   //鼠标拖动的位置int    edgeMargin = 4;     //鼠标检测的边缘距离DIRECTION resizeDir; //更改尺寸的方向bool m_resizing;bool m_repositioning;//帮助判断是否需要激活边框可变化大小bool m_resizeableTop;bool m_resizeableBottom;bool m_resizeableRight;bool m_resizeableLeft;
};#endif // DRAGRESIZEWGT_H

DragResizeWgt类.cpp文件 

#include "DragResizeWgt.h"
#include "ui_DragResizeWgt.h"
#include <QDebug>
#include "Windows.h"
#include <QMouseEvent>
#include <QObject>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#define min(a,b) ((a)<(b)? (a) :(b))
#define max(a,b) ((a)>(b)? (a) :(b))DragResizeWgt::DragResizeWgt(QWidget *parent) :QWidget(parent),ui(new Ui::DragResizeWgt),resizeDir(nodir), m_resizing(false),m_repositioning(false),m_resizeableTop(true), m_resizeableBottom(true),m_resizeableRight(true), m_resizeableLeft(true)
{ui->setupUi(this);this->setObjectName("DragResizeWgt");//注意:一定要设置一个最小的宽高奥,要不会被拖到看不见,默认最小(0,0)setMinimumSize(100, 100);//一定一定要有这句话奥,这是能捕捉到这个窗口鼠标事件的关键,还有一点需要特别注意,如果这个窗口上会叠加其他的widget或者控件,对应的子UI也需要调用setMouseTracking这个函数this->setMouseTracking(true);//鼠标事件过滤器,来处理父窗口与子窗口的事件关系,不能互相干扰,后续会十分用得到setAttribute(Qt::WA_NoMousePropagation);installEventFilter(this);// QVBoxLayout *layout = new QVBoxLayout(this);// QLabel *label = new QLabel("Resizable and Draggable Widget", this);// layout->addWidget(label);edgeMargin = 4;        //设置检测边缘为4resizeDir = nodir;   //初始化检测方向为无setEdgeBeReSized(false,true,true,false);// setEdgeBeReSized(true,true,true,true);setLayout(new QHBoxLayout);
}DragResizeWgt::~DragResizeWgt() = default;void DragResizeWgt::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton)  //每当按下鼠标左键就记录一下位置{dragPosition = event->globalPos() - frameGeometry().topLeft();  //获得鼠标按键位置相对窗口左上面的位置m_startCursor = event->globalPos();m_nLeftOff = frameGeometry().left();m_nRightOff = frameGeometry().right() + 1;m_nTopOff = frameGeometry().top();m_nBottomOff = frameGeometry().bottom() + 1;qDebug() << "mousePressEvent" << dragPosition << m_startCursor << m_nLeftOff << m_nRightOff << m_nTopOff << m_nBottomOff;}
}void DragResizeWgt::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() & Qt::LeftButton)//如果左键是按下的{if(resizeDir == nodir)//鼠标未放置在边缘处,进行窗口整体拖动处理{if(m_repositioning){move(event->globalPos() - dragPosition);}}else//拖拽边缘,根据拖拽方向进行大小调整{int ptop,pbottom,pleft,pright;ptop = m_nTopOff;pbottom = m_nBottomOff;pleft = m_nLeftOff;pright = m_nRightOff;//这里获取父窗口的大小,如果没有则获取全局可用的屏幕大小QRect parentRect = parentWidget() ? parentWidget()->rect() : QApplication::primaryScreen()->availableGeometry();if(resizeDir & top)//拖拽顶部上下变化{//计算根据当前鼠标位置与拖拽偏移量计算当前top的位置ptop = m_nTopOff-(m_startCursor.ry()- event->globalY());qDebug() << "#########top position" << ptop << m_nTopOff << m_startCursor.ry() << event->globalY();if(ptop < 0){ptop = parentRect.height() - this->maximumHeight();}else{if(this->height() <= minimumHeight())//进行极端高度最小的处理{ptop = min(m_nBottomOff-minimumHeight(),ptop);qDebug() << "this->height() >= minimumHeight()" << ptop  << m_nBottomOff << minimumHeight();}else if(this->height() >= maximumHeight())//进行极端高度最大的处理{ptop = max(m_nBottomOff-maximumHeight(),ptop);qDebug() << "this->height() >= maximumHeight()" << ptop << m_nBottomOff << maximumHeight();}}}else if(resizeDir & bottom)//拖拽底部上下变化{//计算根据当前鼠标位置与拖拽偏移量计算当前bottom的位置pbottom = m_nBottomOff +(event->globalY()-m_startCursor.ry());if(pbottom > parentRect.bottom()){pbottom = this->maximumHeight();}else{if(this->height()<minimumHeight())//进行极端高度最小的处理{pbottom = m_nTopOff+minimumHeight();}else if(this->height()>maximumHeight())//进行极端高度最大的处理{pbottom = m_nTopOff+maximumHeight();}}}if(resizeDir & left)//拖拽左侧左右变化{//计算根据当前鼠标位置与拖拽偏移量计算当前left的位置pleft = m_nLeftOff-(m_startCursor.rx() - event->globalX());if(pleft < 0){pleft = 0;}else{if(this->width()<= minimumWidth())//进行极端宽度最小的处理{pleft = min(pleft,m_nRightOff- minimumWidth());}else if(this->width() >= maximumWidth())//进行极端宽度最大的处理{pleft = max(m_nRightOff- maximumWidth(),pleft);}}}else if(resizeDir & right)//拖拽右侧左右变化{//计算根据当前鼠标位置与拖拽偏移量计算当前right的位置pright = m_nRightOff + (event->globalX()-m_startCursor.rx());if(pright > parentRect.right()){pright = parentRect.right();}if(this->width()<minimumWidth())//进行极端宽度最小的处理{pright = m_nLeftOff+minimumWidth();}else if(this->width()> this->maximumWidth())//进行极端宽度最大的处理{pright = m_nLeftOff + this->maximumWidth();}}setGeometry(pleft,ptop,pright-pleft,pbottom-ptop);emit sizeChange();}}else checkEdge();
}void DragResizeWgt::mouseReleaseEvent(QMouseEvent * event)
{// Q_UNUSED(event);if(resizeDir != nodir)//还原鼠标样式{checkEdge();emit sizeChange();}
}void DragResizeWgt::paintEvent(QPaintEvent *event)
{// QPainter painter(this);// painter.fillRect(rect(), Qt::white);QWidget::paintEvent(event);
}void DragResizeWgt::resizeEvent(QResizeEvent *event)
{QWidget::resizeEvent(event);// emit sizeChange();
}bool DragResizeWgt::eventFilter(QObject *watch, QEvent *event)
{//一定要加这一句,不然父窗口的event事件也会出发窗口大小的改变信号if(watch == parentWidget() && event->type() == QEvent::MouseButtonRelease){event->ignore();return true;}// if(watch == parentWidget() && event->type() == QEvent::Resize)// {//     event->ignore();//     return true;// }return QWidget::eventFilter(watch, event);
}void DragResizeWgt::setEdgeBeReSized(const bool &resizeableTop, const bool &resizeableBottom, const bool &resizeableRight, const bool &resizeableLeft)
{m_resizeableTop = resizeableTop;m_resizeableBottom =  resizeableBottom;m_resizeableRight = resizeableRight;m_resizeableLeft = resizeableLeft;
}void DragResizeWgt::setIsRepositioning(const bool &reposition)
{m_repositioning = reposition;
}void DragResizeWgt::checkEdge()
{QPoint pos = this->mapFromGlobal(QCursor::pos());//开始拖拽时点击控件的什么位置int diffLeft = pos.rx();int diffRight = this->width() - diffLeft;int diffTop = pos.ry();int diffBottom = this->height() - diffTop;QCursor tempCursor;                                    //获得当前鼠标样式,注意:只能获得当前鼠标样式然后再重新设置鼠标样式tempCursor = cursor();                                 //因为获得的不是鼠标指针,所以不能这样用:cursor().setXXXXX// qDebug() << "diffLeft" << diffLeft << "diffRight" << diffRight << "diffTop" << diffTop << "diffBottom" << diffBottom ;if(diffTop < edgeMargin && m_resizeableTop){                              //根据 边缘距离 分类改变尺寸的方向if(diffLeft < edgeMargin  && m_resizeableTop && m_resizeableLeft){resizeDir = topLeft;tempCursor.setShape(Qt::SizeFDiagCursor);}else if(diffRight < edgeMargin && m_resizeableTop && m_resizeableRight){resizeDir = topRight;tempCursor.setShape(Qt::SizeBDiagCursor);}else{resizeDir = top;tempCursor.setShape(Qt::SizeVerCursor);}}else if(diffBottom < edgeMargin && m_resizeableBottom){if(diffLeft < edgeMargin && m_resizeableBottom && m_resizeableLeft){resizeDir = bottomLeft;tempCursor.setShape(Qt::SizeBDiagCursor);}else if(diffRight < edgeMargin && m_resizeableBottom && m_resizeableRight){resizeDir = bottomRight;tempCursor.setShape(Qt::SizeFDiagCursor);}else{resizeDir = bottom;tempCursor.setShape(Qt::SizeVerCursor);}}else if(diffLeft < edgeMargin && m_resizeableLeft){resizeDir = left;tempCursor.setShape(Qt::SizeHorCursor);}else if(diffRight < edgeMargin && m_resizeableRight){resizeDir = right;tempCursor.setShape(Qt::SizeHorCursor);}else{resizeDir = nodir;tempCursor.setShape(Qt::ArrowCursor);}setCursor(tempCursor);
}

使用

新建一个主界面窗口testwidget,用于创建主界面包含QWidget和DragResizeWgt共同存在的情况

其中widget_6为底部窗口,widget_5为顶部窗口

注意,我这里右边的窗口类中,我将widget_6和widget提升为了DragResizeWgt窗口类。

 testwidget窗口.ui文件

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>testwidget</class><widget class="QWidget" name="testwidget"><property name="geometry"><rect><x>0</x><y>0</y><width>662</width><height>549</height></rect></property><property name="windowTitle"><string>Form</string></property><layout class="QVBoxLayout" name="verticalLayout_2"><property name="spacing"><number>0</number></property><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property><item><widget class="QWidget" name="widget_8" native="true"><layout class="QVBoxLayout" name="verticalLayout"><property name="spacing"><number>0</number></property><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property><item><widget class="QWidget" name="widget_5" native="true"><property name="minimumSize"><size><width>0</width><height>50</height></size></property><property name="maximumSize"><size><width>16777215</width><height>50</height></size></property></widget></item><item><widget class="QWidget" name="widget_7" native="true"><property name="styleSheet"><string notr="true">background-color: rgb(170, 85, 255);</string></property><layout class="QHBoxLayout" name="horizontalLayout_2"><property name="spacing"><number>0</number></property><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property><item><widget class="DragResizeWgt" name="widget" native="true"><property name="styleSheet"><string notr="true"/></property></widget></item><item><widget class="QWidget" name="widget_4" native="true"><property name="styleSheet"><string notr="true">background-color: rgb(0, 0, 127);</string></property></widget></item></layout></widget></item></layout></widget></item><item><widget class="DragResizeWgt" name="widget_6" native="true"><property name="styleSheet"><string notr="true">background-color: rgb(255, 85, 127);</string></property><layout class="QHBoxLayout" name="horizontalLayout"><property name="spacing"><number>0</number></property></layout></widget></item></layout></widget><customwidgets><customwidget><class>DragResizeWgt</class><extends>QWidget</extends><header>dragresizewgt.h</header><container>1</container></customwidget></customwidgets><resources/><connections/>
</ui>

testwidget窗口.h文件

#ifndef TESTWIDGET_H
#define TESTWIDGET_H#include <QWidget>
#include <QMouseEvent>
namespace Ui {
class testwidget;
}class testwidget : public QWidget
{Q_OBJECTpublic:explicit testwidget(QWidget *parent = nullptr);~testwidget();public:void resizeEvent(QResizeEvent *event);
private:Ui::testwidget *ui;
};#endif // TESTWIDGET_H

testwidget窗口.cpp文件

#include "testwidget.h"
#include "qdebug.h"
#include "ui_testwidget.h"
#include "dragresizewgt.h"
#include <QPushButton>
testwidget::testwidget(QWidget *parent): QWidget(parent), ui(new Ui::testwidget)
{ui->setupUi(this);// DragResizeWgt *w = new DragResizeWgt(this);// w->resize(400,400);// w->setStyleSheet("background-color: rgb(255, 255, 0);");// w->show();// this->setMaximumSize(1920,1080);this->setMouseTracking(true);this->setMinimumSize(480,270);ui->widget->setEdgeBeReSized(false,false,true,false);// ui->widget->setWgtMaxmumSize(300,800);ui->widget->setMinimumSize(100,0);// ui->widget_4->setEdgeBeReSized(false,false,false,true);ui->widget_6->setEdgeBeReSized(true,false,false,false);ui->widget_6->setMinimumSize(0,100);// ui->widget_6->setWgtMaxmumSize(1000,800);// ui->widget->setStyleSheet("background-color: rgb(20, 20, 255);");QWidget *childWidget3 = new QWidget;childWidget3->setMouseTracking(true);childWidget3->setStyleSheet("background-color: rgb(255, 12, 128);");childWidget3->setMouseTracking(true);ui->widget->layout()->addWidget(childWidget3);ui->widget->layout()->setContentsMargins(0,0,0,0);ui->widget->layout()->setSpacing(0);connect(ui->widget, &DragResizeWgt::sizeChange, [=](){qDebug() << "this->width()" << this->width() << "ui->widget->width()"<< ui->widget->width();int remainingWidth = this->width() -  ui->widget->width();ui->widget_4->setFixedWidth(remainingWidth);});connect(ui->widget_6, &DragResizeWgt::sizeChange, [=](){qDebug() << "this->width()" << this->height() << "ui->widget->height()"<< ui->widget_6->height();int remainingHeight= this->height() -  ui->widget_6->height();ui->widget_8->setFixedHeight(remainingHeight);ui->widget_4->setFixedHeight(remainingHeight);});QWidget *childWidget1 = new QWidget;QVBoxLayout *layout = new QVBoxLayout(this);QPushButton *label = new QPushButton("Resizable and Draggable Widget", childWidget1);layout->addWidget(label);childWidget1->setLayout(layout);connect(label,  &QPushButton::clicked, [](){qDebug() << "pushbutton clicked";});childWidget1->setMouseTracking(true);childWidget1->setStyleSheet("background-color: rgb(85, 85, 255);");QWidget *childWidget2 = new QWidget;childWidget2->setMouseTracking(true);childWidget2->setStyleSheet("background-color: rgb(85, 20, 255);");ui->widget_6->layout()->addWidget(childWidget1);ui->widget_6->layout()->addWidget(childWidget2);ui->widget_6->layout()->setContentsMargins(0,0,0,0);ui->widget_6->layout()->setSpacing(0);ui->widget->setIsRepositioning(true);
}testwidget::~testwidget()
{delete ui;
}// void testwidget::mousePressEvent(QMouseEvent *event)
// {// }// void testwidget::mouseReleaseEvent(QMouseEvent *event)
// {// }void testwidget::resizeEvent(QResizeEvent *event)
{qDebug() << "resizeEvent";ui->widget_6->setMaximumSize(this->width(),this->height()*0.7);ui->widget_8->setMinimumWidth(0);ui->widget_8->setMaximumWidth(this->width());ui->widget_8->setMinimumHeight(0);ui->widget_8->setMaximumHeight(this->height() - ui->widget_6->height());ui->widget_4->setMaximumWidth(this->width()*0.9);ui->widget->setMaximumSize(this->width()*0.9,this->height() - ui->widget_5->height());
}

最后在main函数中show()

    testwidget w;w.show();

参考

源于对这篇文章的参考,调试与修改

https://blog.csdn.net/weixin_40425059/article/details/116495403

如有什么别的问题可以留言,谢谢。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短视频抓取:成都柏煜文化传媒有限公司

短视频抓取&#xff1a;技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;成为现代人生活娱乐的重要组成部分。然而&#xff0c;在海量短视频内容中&#xff0c;如何高效、准确地抓取目标视频&#xff0c;成为了一个…

3D立体卡片动效(附源码)

3D立体卡片动效 欢迎关注&#xff1a;xssy5431 小拾岁月参考链接&#xff1a;https://mp.weixin.qq.com/s/9xEjPAA38pRiIampxjXNKQ 效果展示 思路分析 需求含有立体这种关键词&#xff0c;我们第一反应是采用动画中的平移、倾斜等实现。如果是立体&#xff0c;必然产生阴影&…

这才是CSDN最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

24 年程序员各岗位薪资待遇汇总(最新)

大家好&#xff0c;我是程序员鱼皮。今天分享 24 年 6 月最新的程序员各岗位薪资待遇汇总。 数据是从哪儿来的呢&#xff1f;其实很简单&#xff0c;BOSS 直聘上有一个免费的薪酬查询工具&#xff0c;只要认证成为招聘者就能直接看&#xff0c;便于招聘者了解市场&#xff0c;…

线性代数基础概念:行列式

目录 线性代数基础概念&#xff1a;行列式 1. 行列式的定义 1.1 递归定义 1.2 代数余子式定义 1.3 几何定义 2. 行列式的性质 2.1 行列式等于其转置的行列式 2.2 交换两行或两列&#xff0c;行列式变号 2.3 将一行或一列乘以一个数 k&#xff0c;行列式乘以 k 2.4 将…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; Code方式一 使用B…

App测试技术(纯理论)

之前我们也学习过一些普通用例的设计, 如功能, 性能, 安全性, 兼容性, 易用性, 界面的测试用例设计, 之前我们讲的基本都是对于Web应用而言的, 这里我们来讲一下移动端的App测试用例设计. 功能方面 安装&卸载测试 这是只属于App的一类测试, 再平常我们使用移动设备(手机…

鸿蒙 HarmonyOs 动画效果 快速入门

一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长&#xff0c;默认值&#xff1a;1000&#xff0c;单位&#xff1a;毫秒temponumber否动画播放速度。数值越大&#xff0c;速度越快&#xff0c;默认为1curvestring | Curve否 设置动画曲线。 默…

喜提一等奖!白鲸开源在“创业北京”创业创新大赛海淀区选拔赛决赛表现亮眼

6月25日&#xff0c;第七届“创业北京”创业创新大赛海淀区选拔赛决赛在中关村东升国际科学园成功举办。本次活动由海淀区人力资源和社会保障局、中关村科学城管委会主办&#xff0c;以“创响新时代 共圆中国梦”为主题&#xff0c;活动现场主体赛先进制造赛道和主体赛现代服务…

ONLYOFFICE 桌面编辑器 8.1

ONLYOFFICE 桌面编辑器 8.1 ONLYOFFICE 简介一、轻松编辑器 PDF 文件二、用幻灯片版式快速修改幻灯片三、无缝切换文档编辑、审阅和查看模式四、**改进从右至左语言的支持 & 新的本地化选项**五、隐藏“连接到云”板块六、在演示文稿中播放视频和音频文件七、版本 8.1&…

Asp.NET identity以及Owin

》》》Identity是集成到Owin框架中中 ● Microsoft.AspNet.Identity.Core&#xff1a;Identity的核心类库&#xff0c;实现了身份验证的核心功能&#xff0c;并提供了拓展接口。● Microsoft.AspNet.Identity.EntityFramework&#xff1a;Identity数据持久化的EF实现。   ● …

币界网快讯,比特币7月份看牛预测

今日数字货币市场全面开启反弹&#xff0c;比特币从 60,000 美元大关飙升至 63,700 美元&#xff0c;预示着 7 月牛市的到来。在此之前&#xff0c;上周曾短暂跌破 60,000 美元&#xff0c;但受到 BTC 现货 ETF 流入的 7,300 万美元的推动——这是两周以来最大的流入。 BTC价格…

熊猫烧香是什么?

熊猫烧香&#xff08;Worm.WhBoy.cw&#xff09;是一种由李俊制作的电脑病毒&#xff0c;于2006年底至2007年初在互联网上大规模爆发。这个病毒因其感染后的系统可执行文件图标会变成熊猫举着三根香的模样而得名。熊猫烧香病毒具有自动传播、自动感染硬盘的能力&#xff0c;以及…

3dmax如何制作全景图?渲染100邀请码1a12

全景图很常见&#xff0c;制作起来也简单&#xff0c;这里我给大家稍微分享下。 1、创建相机 打开要渲染全景的场景文件&#xff0c;创建相机并调整好位置。 2、 设置分辨率 按F10打开渲染设置界面&#xff0c;选择相机视口&#xff0c;在公用里设置宽度和高度&#xff0c;…

Day38:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换&#xff08;Electronic Data Interchange&#xff0c;EDI&#xff09;是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代&#xff0c;当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

实验6 形态学图像处理

1. 实验目的 ①掌握数字图像处理中&#xff0c;形态学方法的基本思想&#xff1b; ②掌握膨胀、腐蚀、开运算、闭运算等形态学基本运算方法&#xff1b; ③能够利用形态学基本运算方法&#xff0c;编程实现图像去噪&#xff0c;边界提取等功能。 2. 实验内容 ①调用Matlab /…

[数据集][目标检测]电缆钢丝绳线缆缺陷检测数据集VOC+YOLO格式1800张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1800 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注…

为什么我的Skype点数不见了?如何重新激活 Skype 点数?

您超过180天没有使用过点数打电话功能&#xff0c;点数暂时封存在您的账户里面&#xff0c;需要您手动激活&#xff08;目前必须要登录网页版skype&#xff09; 可再次使用。 如何重新激活 Skype 点数&#xff1f; 登录到你的帐户 . 选择 重新激活信用额度 .注意&#xff1a; …

源码学习:文件描述符

在进程描述学习中&#xff0c;扯到了max_fds&#xff0c;接着就联想到了日常运维中常见的ulimit参数、sysctl内核参数&#xff0c;原来以为max_fds与这些个关联性比较强&#xff0c;但经过一早上折腾以后&#xff0c;发现其实还是有一些差距的。但是在学习过程中&#xff0c;却…