Qt无边框窗口拖拽和阴影
先看下效果:

说明
自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件,一种时通过nativeEvent事件处理。重写事件相对繁琐,我们这里推荐nativeEvent处理。注意后续我们在做win平台的进程通信,也会用到它!
- 我们这里使用的是:nativeEvent
软件用到的样式表,这里就不展示了,大家可以自行调整!
关键点说明
QPainterPath
QPainterPath类提供一个容器,可以用来创建图形并且重复使用。绘制器路径是由许多图形构建基块(如矩形、椭圆形、直线和曲线)组成的对象。构建基块可以连接在封闭的子路径中,例如作为矩形或椭圆。封闭路径具有重合的起点和终点。或者它们可以作为未闭合的子路径独立存在,例如直线和曲线。
抗锯齿
- 抗锯齿是一种常见的图形处理技术,用于减少在显示器上呈现的图像中出现的锯齿状边缘。
抗锯齿技术通过在边缘周围添加额外的像素来平滑边缘,从而减少锯齿状边缘。这种技术基于亚像素级别的渲染,它将颜色逐渐混合到边缘像素的周围像素中,使得边缘更加平滑。 - 打开抗锯齿可以使图像更加平滑,尤其是在呈现锐利直线或曲线时。这种技术可以减少锯齿状边缘,使得图像更加清晰,更加真实。特别是在高分辨率屏幕上,抗锯齿可以使得字体更加易读,图像更加细腻。
- 虽然抗锯齿可以使图像更加平滑,但在某些情况下,关闭抗锯齿可能更加合适。关闭抗锯齿可以提高图像处理速度。
- 这里我们基于Qt绘图框架用的是:
- setRenderHint(QPainter::Antialiasing, true); //打开抗锯齿
- setRenderHint(QPainter::Antialiasing, false); //关闭抗锯齿
具体实现
CDlgComBase,无边框窗口,带阴影,支持拖拽,注意:
- 该实现方案不支持存在多个显示屏的情况!
- 该实现方案仅支持win平台!
实现无边框带阴影的窗口代码,下面的代码供大家参考:
DlgComBase.h
#pragma once
#include "DlgShadow.h"
#include "FrameComTitleBar.h"
#include <QVBoxLayout>class CDlgComBase : public CDlgShadow
{Q_OBJECTpublic:CDlgComBase(QWidget *parent = 0, bool bCenterDlg = true, bool bHasTitleBar = true);~CDlgComBase();void SetWindowsTitle(const QString& strTitle, bool bCheckPos = false);// 显示隐藏按钮void ShowMinBtn(bool bShow);void ShowMaxBtn(bool bShow);void ShowCloseBtn(bool bShow);void ShowSettingBtn(bool bShow);void ShowMaximized();void SetTitleBarObjectName(QString strObjectName);void SetHeadBarHeight(int nHeight);protected:virtual bool IsCaption(int nXPos, int nYPos);QWidget* GetCenterWidget() { return &m_frameCenter; }virtual void OnNcLBtnDbClick(int nXPos, int nYPos);protected slots:void OnTimerCenter();private:CFrameComTitleBar m_frameComTitleBar;QVBoxLayout m_vBoxLayout;QFrame m_frameCenter;bool m_bHasTitleBar;
};
DlgComBase.cpp
#include "DlgComBase.h"
#include <QTimer>CDlgComBase::CDlgComBase(QWidget *parent, bool bCenterDlg, bool bHasTitleBar)
: CDlgShadow(parent), m_frameComTitleBar(this), m_frameCenter(this), m_bHasTitleBar(bHasTitleBar)
{m_frameComTitleBar.setObjectName("framComTitleBar");m_frameComTitleBar.setFixedHeight(GetHeadBarHeight());int nShadowLen = GetShadowLen();m_vBoxLayout.setContentsMargins(nShadowLen, nShadowLen, nShadowLen, nShadowLen);m_vBoxLayout.setSpacing(0);if (m_bHasTitleBar){m_vBoxLayout.addWidget(&m_frameComTitleBar);}m_vBoxLayout.addWidget(&m_frameCenter);m_frameCenter.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);setLayout(&m_vBoxLayout);if (bCenterDlg)QTimer::singleShot(10, this, SLOT(OnTimerCenter()));
}CDlgComBase::~CDlgComBase()
{}void CDlgComBase::SetWindowsTitle(const QString& strTitle, bool bCheckPos)
{m_strTitle = strTitle;m_frameComTitleBar.SetWindowsTitle(strTitle, bCheckPos);setWindowTitle(strTitle);
}void CDlgComBase::ShowMinBtn(bool bShow)
{m_frameComTitleBar.ShowMinBtn(bShow);
}void CDlgComBase::ShowMaxBtn(bool bShow)
{SetHasMaxFun(bShow);m_frameComTitleBar.ShowMaxBtn(bShow);
}void CDlgComBase::ShowCloseBtn(bool bShow)
{m_frameComTitleBar.ShowCloseBtn(bShow);
}void CDlgComBase::ShowSettingBtn(bool bShow)
{m_frameComTitleBar.ShowSettingBtn(bShow);
}bool CDlgComBase::IsCaption(int nXPos, int nYPos)
{QWidget* pChild = childAt(nXPos, nYPos);if (pChild == NULL){ADD_LOGD("CDlgComBase::IsCaption() return true");return true;}if (pChild == &m_frameComTitleBar || pChild == m_frameComTitleBar.GetTitleLabel()){ADD_LOGD("CDlgComBase::IsCaption() return true");return true;}ADD_LOGD("CDlgComBase::IsCaption() return false");return false;
}void CDlgComBase::SetTitleBarObjectName(QString strObjectName)
{m_frameComTitleBar.setObjectName(strObjectName);
}void CDlgComBase::OnTimerCenter()
{CenterInParent((QWidget*)parent());
}void CDlgComBase::SetHeadBarHeight(int nHeight)
{m_frameComTitleBar.setFixedHeight(nHeight);CDlgShadow::SetHeadBarHeight(nHeight);
}void CDlgComBase::ShowMaximized()
{m_frameComTitleBar.ShowMaximized();CDlgShadow::ShowMaximized();
}void CDlgComBase::OnNcLBtnDbClick(int nXPos, int nYPos)
{if (m_bHasMaxFun)m_frameComTitleBar.ShowMaxRestoreBtn(m_bMaximized);CDlgShadow::OnNcLBtnDbClick(nXPos, nYPos);
}
DlgShadow.h
#ifndef SHADOWDLG_H
#define SHADOWDLG_H
#include <QDialog>
#include <QMouseEvent>class CDlgShadow : public QDialog
{Q_OBJECTpublic:CDlgShadow(QWidget *parent = 0);~CDlgShadow();void HideDlg();void ShowDlg();void SetDlgBkColor(QColor& clrDlgBk);void CenterInParent(QWidget* pWidget);void SetResizeable(bool bOn) { m_bResizeable = bOn; }virtual void OnBtnSettingClicked(QPoint& ptBtnBottom);virtual void OnBtnMinClicked();virtual void OnBtnMaxClicked();virtual void OnBtnRestoreClicked();virtual void OnBtnCloseClicked();virtual bool OnProHotKey(int nFsModifiers, int nVk);virtual void OnMsgEndSession();void ShowMaximized();protected:void paintEvent(QPaintEvent* event);void keyPressEvent(QKeyEvent* event);int GetShadowLen() { return m_nShadowLen; }int GetHeadBarHeight() { return m_nHeadBarHeight; }void SetHeadBarHeight(int nHeight);void SetHasMaxFun(bool bHasMaxFun) { m_bHasMaxFun = bHasMaxFun; }bool nativeEvent(const QByteArray& eventType, void* pMessage, long* pResult);virtual bool IsCaption(int nXPos, int nYPos);virtual void OnNcLBtnDbClick(int nXPos, int nYPos);virtual void OnKeyReturnPress();virtual void OnKeyEscapePress();virtual void OnNcLBtnClick();void closeEvent(QCloseEvent *event);protected:int m_nFrameLen; // 边框宽度,单位:像素int m_nShadowLen; // 阴影宽度,单位:像素int m_nHeadBarHeight; // 标题栏高度bool m_bHasMaxFun;bool m_bMaximized;bool m_bNcLBtnClk;bool m_bHideDlg;QString m_strTitle; // 调试时使用bool m_bHotKey; // 处理快捷键功能private:QRect m_rectDlg;QColor m_clrDlgBk;bool m_bResizeable;
};#endif // SHADOWDLG_H
DlgShadow.cpp
#include "DlgShadow.h"
#include <QPainter>
#include <qmath.h>
#include <QApplication>
#include <QDesktopWidget>
#include <Windows.h>CDlgShadow::CDlgShadow(QWidget *parent): QDialog(parent)
{setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog | Qt::WindowMinimizeButtonHint);setAttribute(Qt::WA_TranslucentBackground);m_nFrameLen = 10;m_nShadowLen = 6;m_nHeadBarHeight = 36;m_bMaximized = false;m_bHasMaxFun = true;m_clrDlgBk = QColor(255, 255, 255);m_bResizeable = true;m_bNcLBtnClk = false;m_bHideDlg = false;m_bHotKey = false;
}CDlgShadow::~CDlgShadow()
{}void CDlgShadow::paintEvent(QPaintEvent* event)
{QPainterPath path;path.setFillRule(Qt::WindingFill);path.addRoundedRect(m_nShadowLen, m_nShadowLen, width() - 2 * m_nShadowLen, height() - 2 * m_nShadowLen, 2, 2);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.fillPath(path, QBrush(m_clrDlgBk));QColor color(0, 0, 0, 50);for (int i = 0; i < m_nShadowLen; i++){QPainterPath pathShadow;pathShadow.setFillRule(Qt::WindingFill);pathShadow.addRoundedRect(m_nShadowLen - i, m_nShadowLen - i, width() - (m_nShadowLen - i) * 2, height() - (m_nShadowLen - i) * 2, 2 + i, 2 + i);int nAlpha = 50 - qSqrt(i) * 25;if (nAlpha < 0)nAlpha = 0;color.setAlpha(nAlpha);painter.setPen(color);painter.drawPath(pathShadow);}painter.setRenderHint(QPainter::Antialiasing, false);painter.fillPath(path, QBrush(m_clrDlgBk));QDialog::paintEvent(event);
}void CDlgShadow::OnBtnMinClicked()
{showMinimized();
}void CDlgShadow::OnBtnMaxClicked()
{m_bMaximized = true;m_rectDlg = geometry();setGeometry(-m_nShadowLen, -m_nShadowLen, QApplication::desktop()->availableGeometry().width() + m_nShadowLen * 2,QApplication::desktop()->availableGeometry().height() + m_nShadowLen * 2);
}void CDlgShadow::OnBtnRestoreClicked()
{m_bMaximized = false;setFixedHeight(QWIDGETSIZE_MAX);setGeometry(m_rectDlg);
}void CDlgShadow::SetDlgBkColor(QColor& clrDlgBk)
{m_clrDlgBk = clrDlgBk;
}void CDlgShadow::SetHeadBarHeight(int nHeight)
{m_nHeadBarHeight = nHeight;
}bool CDlgShadow::IsCaption(int nXPos, int nYPos)
{if (childAt(nXPos, nYPos) == 0){ADD_LOGD("CDlgShadow::IsCaption() return true");return true;}else{ADD_LOGD("CDlgShadow::IsCaption() return false");return false;}
}bool CDlgShadow::nativeEvent(const QByteArray& eventType, void* pMessage, long* pResult)
{ADD_LOGD(QString("CDlgShadow::nativeEvent in"));if (m_bHideDlg){ADD_LOGD(QString("CDlgShadow::nativeEvent out"));return QDialog::nativeEvent(eventType, pMessage, pResult);}const MSG* pMsg = static_cast<MSG*>(pMessage);if (pMsg->message == WM_NCHITTEST){RECT rect;SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);int nWin32Width = rect.right - rect.left;int nWin32Height = rect.bottom - rect.top;int nQtWidth = QApplication::desktop()->availableGeometry().width();int nQtHeight = QApplication::desktop()->availableGeometry().height();int nMsgX = ((int)(short)LOWORD(pMsg->lParam)) * nQtWidth / nWin32Width;int nMsgY = ((int)(short)HIWORD(pMsg->lParam)) * nQtHeight / nWin32Height;int xPos = nMsgX - frameGeometry().x();int yPos = nMsgY - frameGeometry().y();if (IsCaption(xPos, yPos)){*pResult = HTCAPTION;}else{ADD_LOGD(QString("CDlgShadow::nativeEvent out, WM_NCHITTEST pResult:%1").arg(*pResult));return false;}if (!m_bResizeable){if (*pResult == HTCAPTION){ADD_LOGD(QString("CDlgShadow::nativeEvent out, WM_NCHITTEST pResult:%1").arg(*pResult));return true;}ADD_LOGD(QString("CDlgShadow::nativeEvent out, WM_NCHITTEST pResult:%1").arg(*pResult));return QDialog::nativeEvent(eventType, pMessage, pResult);}if (xPos > 0 && xPos < m_nFrameLen)*pResult = HTLEFT;if (xPos >(width() - m_nFrameLen) && xPos < (width() - 0))*pResult = HTRIGHT;if (yPos > 0 && yPos < m_nFrameLen)*pResult = HTTOP;if (yPos >(height() - m_nFrameLen) && yPos < (height() - 0))*pResult = HTBOTTOM;if (xPos > 0 && xPos < m_nFrameLen && yPos > 0 && yPos < m_nFrameLen)*pResult = HTTOPLEFT;if (xPos >(width() - m_nFrameLen) && xPos < (width() - 0) && yPos > 0 && yPos < m_nFrameLen)*pResult = HTTOPRIGHT;if (xPos > 0 && xPos < m_nFrameLen && yPos >(height() - m_nFrameLen) && yPos < (height() - 0))*pResult = HTBOTTOMLEFT;if (xPos >(width() - m_nFrameLen) && xPos < (width() - 0) && yPos >(height() - m_nFrameLen) && yPos < (height() - 0))*pResult = HTBOTTOMRIGHT;ADD_LOGD(QString("CDlgShadow::nativeEvent out, WM_NCHITTEST pResult:%1").arg(*pResult));return true;}else if (pMsg->message == WM_NCLBUTTONDBLCLK){int xPos = ((int)(short)LOWORD(pMsg->lParam)) - frameGeometry().x();int yPos = ((int)(short)HIWORD(pMsg->lParam)) - frameGeometry().y();OnNcLBtnDbClick(xPos, yPos);ADD_LOGD(QString("CDlgShadow::nativeEvent out, WM_NCLBUTTONDBLCLK"));return true;}else if (pMsg->message == WM_NCLBUTTONDOWN){if (m_bNcLBtnClk){OnNcLBtnClick();}}else if (pMsg->message == WM_HOTKEY){if (m_bHotKey){UINT nFuModifiers = (UINT)LOWORD(pMsg->lParam); // 模式UINT nVirtKey = (UINT)HIWORD(pMsg->lParam); // 键值if (OnProHotKey(nFuModifiers, nVirtKey)){ADD_LOGD(QString("CDlgShadow::nativeEvent out, WM_HOTKEY"));return true;}}}else if (pMsg->message == WM_ENDSESSION){ADD_LOGD(QStringLiteral("截获关机指令1"));OnMsgEndSession();}ADD_LOGD(QString("CDlgShadow::nativeEvent out"));return QDialog::nativeEvent(eventType, pMessage, pResult);
}void CDlgShadow::OnNcLBtnDbClick(int nXPos, int nYPos)
{if (!m_bHasMaxFun)return;if (nYPos > m_nFrameLen + m_nHeadBarHeight)return;if (m_bMaximized){OnBtnRestoreClicked();}else{OnBtnMaxClicked();}
}void CDlgShadow::CenterInParent(QWidget* pWidget)
{int nXPos = 0;int nYPos = 0;if (pWidget == NULL){nXPos = (QApplication::desktop()->width() - width()) / 2;nYPos = (QApplication::desktop()->height() - height()) / 2;}else{QWidget* pParent = (QWidget*)pWidget->parent();
// if (pParent != NULL)
// {
// //QPoint ptGloba = pWidget->mapToGlobal(QPoint(0, 0));
// nXPos = /*ptGloba.x() + */(pWidget->width() - width()) / 2;
// nYPos = /*ptGloba.y() + */(pWidget->height() - height()) / 2;
// }
// else{QPoint ptGloba = pWidget->mapToGlobal(QPoint(0, 0));nXPos = ptGloba.x() + (pWidget->width() - width()) / 2;nYPos = ptGloba.y() + (pWidget->height() - height()) / 2;}}move(nXPos, nYPos);
}void CDlgShadow::keyPressEvent(QKeyEvent* event)
{if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return/* || event->key() == Qt::Key_Space*/){OnKeyReturnPress();event->accept();}else if (event->key() == Qt::Key_Escape){OnKeyEscapePress();event->ignore();}
}void CDlgShadow::OnKeyReturnPress()
{//accept();
}void CDlgShadow::OnKeyEscapePress()
{//reject();
}void CDlgShadow::OnBtnCloseClicked()
{reject();
}void CDlgShadow::OnBtnSettingClicked(QPoint& ptBtnBottom)
{}void CDlgShadow::OnNcLBtnClick()
{}void CDlgShadow::HideDlg()
{m_bHideDlg = true;setWindowOpacity(0);
}void CDlgShadow::ShowDlg()
{setWindowOpacity(1);m_bHideDlg = false;
}void CDlgShadow::closeEvent(QCloseEvent *event)
{event->ignore();OnBtnCloseClicked();
}bool CDlgShadow::OnProHotKey(int nFsModifiers, int nVk)
{return false;
}void CDlgShadow::OnMsgEndSession()
{}void CDlgShadow::ShowMaximized()
{m_bMaximized = true;int nXPos = (QApplication::desktop()->availableGeometry().width() - (1273 + 11)) / 2;int nYPos = (QApplication::desktop()->availableGeometry().height() - (878 + 11)) / 2;int nMaxHeight = QApplication::desktop()->availableGeometry().height() + m_nShadowLen * 2;//setFixedHeight(nMaxHeight);setFixedHeight(QWIDGETSIZE_MAX);m_rectDlg = QRect(nXPos, nYPos, (1273 + 11), (878 + 11));setGeometry(-m_nShadowLen, -m_nShadowLen, QApplication::desktop()->availableGeometry().width() + m_nShadowLen * 2,QApplication::desktop()->availableGeometry().height() + m_nShadowLen * 2);
}相关文章:
Qt无边框窗口拖拽和阴影
先看下效果: 说明 自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件,一种时通过nativeEvent事件处理。重写事件相对繁琐,我们这里推荐nativeEvent处理。注意后续我们在做win平…...
ES6 Proxy详解
文章目录 概述Proxy 实例的方法get(target, propKey, receiver)set(target, propKey, value, receiver)has(target, propKey)deleteProperty(target, propKey)defineProperty(target, propKey, propDesc)getOwnPropertyDescriptor(target, propKey)getPrototypeOf(target)setPr…...
Prompt Learning 的几个重点paper
Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for Generation 在输入token之前构造一段任务相关的virtual tokens作为Prefix,然后训练的时候只更新Prefix部分的参数,PLM中的其他参数固定。针对自回归架构模型:在句子前面添…...
中科大计网学习记录笔记(三):接入网和物理媒体
前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…...
设计模式:工厂方法模式
工厂模式属于创建型模式,也被称为多态工厂模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离,有子类决定要实例化的产品是哪一个,把产品的实例化推迟到子类。 使用场景 重复代码 : 创建对象…...
HTML 相关知识点记录
<div> </div> DIV标签详细介绍-CSDN博客 div 是 division 的简写,division 意为分割、区域、分组。比方说,当你将一系列的链接组合在一起,就形成了文档的一个 division。 <p>标签:定义段落...
系统架构设计师考试大纲2023
一、 考试方式(机考) 考试采取科目连考、 分批次考试的方式, 连考的第一个科目作答结束交卷完成后自动进 入第二个科目, 第一个科目节余的时长可为第二个科目使用。 高级资格: 综合知识科目考试时长 150 分钟ÿ…...
sqli.labs靶场(第18~22关)
18、第十八关 经过测试发现User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0加引号报错 这里我们闭合一下试试 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0,127.0.0.1,adm…...
【tensorflow 版本 keras版本】
#. 安装tensorflow and keras, 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表,确定安装的tesorflow, keras...
嵌入式学习第十六天
制作俄罗斯方块小游戏(一) 分析: printf函数高级用法 \033[:表示转义序列的开始 m:表示转义序列的结束 0:重置所有属性 1:设置粗体或高亮 30-37:设置字体色 30: 黑 31: 红 32:…...
Java过滤器拦截器的区别和实现
一、什么是过滤器与拦截器? 1.2 拦截器(Interceptor) java过滤器指的是在java中起到过滤的作用的一个方法。可以在一个请求到达servlet之前,将其截取进行逻辑判断,然后决定是否放行到请求的servlet;也可以在…...
Android 12 系统开机动画
修改Android开机动画有两种方式 方式一、通过adb 命令来修改: 进入/system/media目录,将里面的 bootanimation.zip 文件pull出来,然后解压,替换part0和part1中的图片,并且根据图片大小修改文件 desc.txt 中的内容&…...
C++:异常体系
异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序,如assert,缺陷:用户难以…...
民事二审案件庭审应如何准备?
一、你要明确审理范围,固定上诉请求 首先,第二审人民法院围绕当事人的上诉请求进行审理。 其次,在第二审程序中,原审原告增加独立的诉讼请求或者原审被告提出反诉的,第二审人民法院可以根据当事人自愿的原则就新增加的…...
WebRTC系列-H264视频帧组包(视频花屏问题)
文章目录 工具函数是否满足组帧条件函数PotentialNewFrame更新丢失包记录 UpdateMissingPackets重要属性1. InsertPacket2. FindFramesWebRTC在弱网环境下传输较大的视频数据,比如:屏幕共享数据;会偶发的出现黑屏的问题;也就是说当视频的码率比较大且视频的分辨率比较高的时…...
Common Mistakes in German
Comman Mistakes in German 1, Haus oder Hause2, ja nein oder doch(1) Positive Fragen(2) Negative Fragen 1, Haus oder Hause 2, ja nein oder doch (1) Positive Fragen (2) Negative Fragen kein / nicht P3...
Java基础数据结构之反射
一.定义 Java的反射机制是在运行状态中的,对于任意一个类都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法及属性。既然能拿到,我们就可以修改部分类型信息。这种动态获取信息以及动态调用对象方法的功能…...
【实战系列----消息队列 数据缓存】rabbitmq 消息队列 搭建和应用
线上运行图,更新不算最新版,但可以使用修改线程等补丁功能,建议使用新版本。 远程服务器配置图: 这个可以更具体情况,因为是缓存队列理所当然 内存越大越好,至于核心4核以上足够使用。4核心一样跑 这里主要是需要配置服…...
【云原生kubernetes系列】---亲和与反亲和
1、亲和和反亲和 node的亲和性和反亲和性pod的亲和性和反亲和性 1.1node的亲和和反亲和 1.1.1ndoeSelector(node标签亲和) #查看node的标签 rootk8s-master1:~# kubectl get nodes --show-labels #给node节点添加标签 rootk8s-master1:~# kubectl la…...
【极简】Pytorch中的register_buffer()
register buffer 定义模型能用torch.save保存的、但是不更新参数。 使用:只要是nn.Module的子类就能直接self.调用使用: class A(nn.Module): #... self.register_buffer(betas, torch.linspace(beta_1, beta_T, T).double()) #...手动定义参数 上述…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
