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

Qt无边框窗口拖拽和阴影

先看下效果:

在这里插入图片描述

说明

自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件,一种时通过nativeEvent事件处理。重写事件相对繁琐,我们这里推荐nativeEvent处理。注意后续我们在做win平台的进程通信,也会用到它!

  • 我们这里使用的是:nativeEvent

软件用到的样式表,这里就不展示了,大家可以自行调整!

关键点说明

QPainterPath

QPainterPath类提供一个容器,可以用来创建图形并且重复使用。绘制器路径是由许多图形构建基块(如矩形、椭圆形、直线和曲线)组成的对象。构建基块可以连接在封闭的子路径中,例如作为矩形或椭圆。封闭路径具有重合的起点和终点。或者它们可以作为未闭合的子路径独立存在,例如直线和曲线。

抗锯齿

  1. 抗锯齿是一种常见的图形处理技术,用于减少在显示器上呈现的图像中出现的锯齿状边缘。
    抗锯齿技术通过在边缘周围添加额外的像素来平滑边缘,从而减少锯齿状边缘。这种技术基于亚像素级别的渲染,它将颜色逐渐混合到边缘像素的周围像素中,使得边缘更加平滑。
  2. 打开抗锯齿可以使图像更加平滑,尤其是在呈现锐利直线或曲线时。这种技术可以减少锯齿状边缘,使得图像更加清晰,更加真实。特别是在高分辨率屏幕上,抗锯齿可以使得字体更加易读,图像更加细腻。
  3. 虽然抗锯齿可以使图像更加平滑,但在某些情况下,关闭抗锯齿可能更加合适。关闭抗锯齿可以提高图像处理速度。
  4. 这里我们基于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无边框窗口拖拽和阴影

先看下效果&#xff1a; 说明 自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件&#xff0c;一种时通过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&#xff0c;然后训练的时候只更新Prefix部分的参数&#xff0c;PLM中的其他参数固定。针对自回归架构模型&#xff1a;在句子前面添…...

中科大计网学习记录笔记(三):接入网和物理媒体

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…...

设计模式:工厂方法模式

工厂模式属于创建型模式&#xff0c;也被称为多态工厂模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离&#xff0c;有子类决定要实例化的产品是哪一个&#xff0c;把产品的实例化推迟到子类。 使用场景 重复代码 : 创建对象…...

HTML 相关知识点记录

<div> </div> DIV标签详细介绍-CSDN博客 div 是 division 的简写&#xff0c;division 意为分割、区域、分组。比方说&#xff0c;当你将一系列的链接组合在一起&#xff0c;就形成了文档的一个 division。 <p>标签&#xff1a;定义段落...

系统架构设计师考试大纲2023

一、 考试方式&#xff08;机考&#xff09; 考试采取科目连考、 分批次考试的方式&#xff0c; 连考的第一个科目作答结束交卷完成后自动进 入第二个科目&#xff0c; 第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a; 综合知识科目考试时长 150 分钟&#xff…...

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&#xff0c; 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表&#xff0c;确定安装的tesorflow, keras...

嵌入式学习第十六天

制作俄罗斯方块小游戏&#xff08;一&#xff09; 分析&#xff1a; printf函数高级用法 \033[&#xff1a;表示转义序列的开始 m&#xff1a;表示转义序列的结束 0&#xff1a;重置所有属性 1&#xff1a;设置粗体或高亮 30-37&#xff1a;设置字体色 30: 黑 31: 红 32:…...

Java过滤器拦截器的区别和实现

一、什么是过滤器与拦截器&#xff1f; 1.2 拦截器&#xff08;Interceptor&#xff09; java过滤器指的是在java中起到过滤的作用的一个方法。可以在一个请求到达servlet之前&#xff0c;将其截取进行逻辑判断&#xff0c;然后决定是否放行到请求的servlet&#xff1b;也可以在…...

Android 12 系统开机动画

修改Android开机动画有两种方式 方式一、通过adb 命令来修改&#xff1a; 进入/system/media目录&#xff0c;将里面的 bootanimation.zip 文件pull出来&#xff0c;然后解压&#xff0c;替换part0和part1中的图片&#xff0c;并且根据图片大小修改文件 desc.txt 中的内容&…...

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…...

民事二审案件庭审应如何准备?

一、你要明确审理范围&#xff0c;固定上诉请求 首先&#xff0c;第二审人民法院围绕当事人的上诉请求进行审理。 其次&#xff0c;在第二审程序中&#xff0c;原审原告增加独立的诉讼请求或者原审被告提出反诉的&#xff0c;第二审人民法院可以根据当事人自愿的原则就新增加的…...

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的反射机制是在运行状态中的&#xff0c;对于任意一个类都能知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法及属性。既然能拿到&#xff0c;我们就可以修改部分类型信息。这种动态获取信息以及动态调用对象方法的功能…...

【实战系列----消息队列 数据缓存】rabbitmq 消息队列 搭建和应用

线上运行图&#xff0c;更新不算最新版&#xff0c;但可以使用修改线程等补丁功能&#xff0c;建议使用新版本。 远程服务器配置图: 这个可以更具体情况&#xff0c;因为是缓存队列理所当然 内存越大越好&#xff0c;至于核心4核以上足够使用。4核心一样跑 这里主要是需要配置服…...

【云原生kubernetes系列】---亲和与反亲和

1、亲和和反亲和 node的亲和性和反亲和性pod的亲和性和反亲和性 1.1node的亲和和反亲和 1.1.1ndoeSelector&#xff08;node标签亲和&#xff09; #查看node的标签 rootk8s-master1:~# kubectl get nodes --show-labels #给node节点添加标签 rootk8s-master1:~# kubectl la…...

【极简】Pytorch中的register_buffer()

register buffer 定义模型能用torch.save保存的、但是不更新参数。 使用&#xff1a;只要是nn.Module的子类就能直接self.调用使用&#xff1a; class A(nn.Module): #... self.register_buffer(betas, torch.linspace(beta_1, beta_T, T).double()) #...手动定义参数 上述…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...