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);
}

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

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

相关文章

MySQL知识点总结(二)——explain执行计划、SQL优化

MySQL知识点总结&#xff08;二&#xff09;——explain执行计划、SQL优化 explain执行计划typepossible_keyskeysextra SQL优化SQL优化的流程SQL优化技巧范围查询优化排序优化分组查询优化distinct优化分页查询优化join关联查询优化排序分页 关联查询分组 关联查询 排序in与…

手把手带你Git入门,从下载到精通,常用git命令

文章目录 Git概述什么是GitGit历史Git是什么 为什么要使用Git什么是版本控制系统 Git和SVN对比SVN集中式SVN优缺点 Git分布式Git优缺点 Git工作流程四个工作区域工作流程 Git下载与安装下载window版下载64位软件包安装Git Git基础环境配置设置用户信息查看配置信息 文件的两种状…

ES6.8.6 创建索引配置分词器、映射字段指定分词器、查询数据高亮显示分词结果(内置分词器、icu、ik、pinyin分词器)

文章目录 ES环境内置分词器&#xff0c;以simple分词器示例查询创建索引simple_news&#xff0c;修改分词器为simple插入模拟数据分词查询&#xff1a;返回通过分词查询到的结果、高亮分词分词匹配&#xff1a;写一次示例&#xff0c;其他分词和匹配思路基本一致第一步&#xf…

DMA 和 零拷贝技术 到 网络大文件传输优化

文章目录 DMA 控制器的发展无 DMA 控制器 IO 过程DMA 控制器 传统文件传输性能有多糟糕&#xff1f;如何优化文件传输性能零拷贝技术mmap writesendfileSG-DMA&#xff08;The Scatter-Gather Direct Memory Access&#xff09; 零拷贝技术的应用 大文件传输应该用什么方式Pag…

后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 1…

idea 创建 spring boot

1.创建步骤 2. 编码添加 2.1 这是自动生成的启动函数 package com.example.comxjctest4;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class Application {publi…

MySql的使用方法

一.什么是MySql MySql是一种数据库管理系统&#xff0c;是用来存储数据的&#xff0c;可以有效的管理数据&#xff0c;数据库的存储介质为硬盘和内存。 和文件相比&#xff0c;它具有以下优点&#xff1a; 文件存储数据是不安全的&#xff0c;且不方便数据的查找和管理&#xf…

【3分钟开服】幻兽帕鲁服务器一键部署保姆教程,PalWorld开服联机教程

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。 想要部署属于自…

从零开发短视频电商 Tesseract OCR识别增强

文章目录 概要图像预处理阶段默认反转图像重新缩放二值化噪音消除膨胀/腐蚀旋转/偏移校正边框缺少边框边框太大扫描边框去除 透明度/Alpha通道 引擎处理阶段语言模型配置提高识别速度词典、单词列表和模式表格识别 使用 Tesseract OCR 的 GUI 和其他项目 原文如下&#xff1a; …

TypeScript实战系列之合理运用类型

目录 介绍any 和 unknownerve 的用途断言type 和 interfacedeclare 关键字的作用联合类型 和 类型守卫交叉类型 介绍 这篇主要介绍下ts 常用的基本类型和一些常用的技巧性技能 any 和 unknow any 和 unknown 是两个类型关键字&#xff0c;它们用于处理类型不确定或未知的情况…

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

力扣日记1.28-【回溯算法篇】93. 复原 IP 地址

力扣日记&#xff1a;【回溯算法篇】93. 复原 IP 地址 日期&#xff1a;2023.1.28 参考&#xff1a;代码随想录、力扣 93. 复原 IP 地址 题目描述 难度&#xff1a;中等 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&…

IP地址定位技术的巧妙运用:企业网络安全的坚实防线

在当今数字时代&#xff0c;企业网络安全成为了至关重要的议题。面对不断增长的网络威胁&#xff0c;企业不得不采用创新性技术来保护其机密信息和关键系统。IP地址定位技术作为一种强大的工具&#xff0c;为企业提供了一种新颖而高效的网络安全保护手段。 IP地址定位技术简介 …

前端Vue v-for 的使用

目录 ​编辑 简介 使用方式 基本使用 v-for"(item, index)中item和index作用 示例 迭代对象 示例 结果 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入…

证券公司怎么选择?福州开股票账户佣金最低是多少?怎么开低佣金账户?

股票交易佣金是指投资者在进行股票交易时&#xff0c;需要向券商支付的手续费。具体的佣金费用根据券商的政策而有所不同&#xff0c;一般分为固定佣金和按比例佣金两种方式。 固定佣金是指交易每一笔固定收取一定金额的佣金&#xff0c;通常适用于较小交易量的投资者&#xf…

github ssh ssh-keygen

生成和使用 SSH 密钥对是一种安全的身份验证方式&#xff0c;用于在你的本地系统和 GitHub 之间进行身份验证。以下是在 GitHub 上生成和使用 SSH 密钥对的基本步骤&#xff1a; 1. 生成 SSH 密钥对 在命令行中执行以下命令来生成 SSH 密钥对&#xff1a; ssh-keygen -C &q…

ATT汇编

指令后缀 AT&T格式的汇编指令有不同的后缀 其中 b表示byte&#xff0c;字节 w表示word&#xff0c;字/两字节 l表示long&#xff0c;32位系统下的long是4字节 q表示quad&#xff0c;意味四重&#xff0c;表示4个字/8字节 寄存器用途 参见 AT&T的汇编世界 - Gemfield…

把数组中的key都取出来然后去重

今日接到一个小需求&#xff0c;一张表有类似这样的数据&#xff1a;&#xff08;下面是一行&#xff09; 但是每行的数据&#xff0c;主要是key不一样&#xff0c;我们想把所有的key取出来&#xff0c;并且做个去重。 首先我先在mysql中&#xff0c; SELECT GROUP_CONCAT(RE…

蓝桥杯---九数组分数

1,2,3 ... 9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码。 注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。 代码 public class _05九数组分数 {public static void test(int[] x){int a …

Linux, Certbot快速申请免费https证书

linux环境. 更新apt,为了能正确的下载certbot apt update 安装certbot apt install certbot 如果之前nginx已经开启着了,先关掉,防止端口占用 nginx -s stop 运行certbot开始获取证书文件 certbot certonly 输入1直接回车,意思就是让certbot模拟一个web服务器执行下面的…