【Qt】可爱的窗口关闭确认弹窗实现
文章目录
- 实现思路
- 界面构建
- 交互逻辑实现
- 颜色渐变处理
- 圆形部件绘制
- 代码
- 在主窗口的构造函数中创建弹窗实例
- ExitConfirmDialog 类代码
- ColorCircleWidget 类代码
今天在Qt实现了这样一个可互动的窗口(上图由于录屏工具限制没有录制到鼠标)
实现思路
实现这样一个可爱的退出确认弹窗,整体思路是结合多个组件和交互逻辑来打造具有吸引力和交互性的界面。具体如下:
界面构建
- 布局设计:在
ExitConfirmDialog类的构造函数中,使用多种布局(如QVBoxLayout和QHBoxLayout)将各个组件有序排列。首先创建提示信息标签显示询问文本,然后添加圆形部件ColorCircleWidget作为视觉焦点,最后设置“确认退出”和“取消”两个按钮,方便用户进行操作选择。 - 组件创建与属性设置:对每个组件进行个性化设置,如调整标签的字体大小和对齐方式,设置按钮的文本内容,固定圆形部件的大小等,同时为部分组件设置鼠标穿透属性,避免影响整体交互体验。
交互逻辑实现
- 按钮点击响应:使用
connect函数将按钮的点击信号与相应的槽函数连接。当点击“确认退出”按钮时,触发onRightButtonClicked槽函数,发出rightButtonClicked信号并接受对话框;点击“取消”按钮时,直接拒绝对话框。 - 鼠标交互效果:通过重写
mouseMoveEvent、enterEvent和leaveEvent事件处理函数,实现与鼠标的交互效果。当鼠标移动或进入对话框时,调用updateCircleGradientBasedOnMouse函数根据鼠标位置更新圆形部件的渐变颜色和嘴巴表情,同时更新眼珠位置,使圆形部件更生动;当鼠标离开对话框时,将圆形部件的渐变颜色、嘴巴表情和眼珠位置恢复到初始状态。
颜色渐变处理
- 获取渐变颜色:定义
getColorFromGradient函数,用于从线性渐变中获取指定位置的颜色。通过遍历渐变的颜色停靠点,计算指定位置的颜色值,实现颜色的平滑过渡。 - 混合渐变颜色:在
updateCircleGradientBasedOnMouse函数中,根据鼠标到两个按钮的距离计算权重,对权重进行平滑处理后,根据权重混合不同的渐变颜色,生成最终的渐变效果,并应用到圆形部件上。
圆形部件绘制
- 初始化与属性设置:在
ColorCircleWidget类的构造函数中,初始化圆形部件的基本属性,如嘴巴表情、渐变颜色等,并开启鼠标跟踪功能。 - 绘制图形:重写
paintEvent函数,使用QPainter绘制圆形、眼睛、眼珠和嘴巴等图形元素。根据当前的渐变颜色填充圆形,根据嘴巴表情调整嘴巴宽度,根据鼠标位置更新眼珠位置,实现动态绘制效果。
代码
在主窗口的构造函数中创建弹窗实例
// 拦截默认关闭事件_closeDialog = new ExitConfirmDialog(this);_closeDialog->setFixedSize(400,300);connect(_closeDialog, &ExitConfirmDialog::rightButtonClicked, this, &MainWindow::closeWindow);this->setIsDefaultClosed(false);connect(this, &MainWindow::closeButtonClicked, this, [=]() {_closeDialog->exec();});
ExitConfirmDialog 类代码
#ifndef EXITCONFIRMDIALOG_H
#define EXITCONFIRMDIALOG_H#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include "ColorCircleWidget.h"class ExitConfirmDialog : public QDialog
{Q_OBJECT
public:explicit ExitConfirmDialog(QWidget *parent = nullptr);~ExitConfirmDialog();signals:void rightButtonClicked();protected:void mouseMoveEvent(QMouseEvent *event) override;void enterEvent(QEnterEvent *event) override;void leaveEvent(QEvent *event) override;private slots:void onRightButtonClicked();private:QLabel *messageLabel;QPushButton *rightButton;QPushButton *cancelButton;ColorCircleWidget *circleWidget;void updateCircleGradientBasedOnMouse();QColor getColorFromGradient(const QLinearGradient& gradient, double position);
};#endif // EXITCONFIRMDIALOG_H
#include "ExitConfirmDialog.h"
#include <QPalette>
#include <QSpacerItem>
#include <QLinearGradient>
#include <QDebug>
#include <QEasingCurve>
#include <QMouseEvent>ExitConfirmDialog::ExitConfirmDialog(QWidget *parent) : QDialog(parent)
{setWindowTitle("确认退出");// 创建提示信息标签messageLabel = new QLabel("确定要退出应用程序吗?", this);messageLabel->setAlignment(Qt::AlignHCenter);QFont font = messageLabel->font();font.setPointSize(18);messageLabel->setFont(font);messageLabel->setAttribute(Qt::WA_TransparentForMouseEvents); // 设置鼠标穿透// 创建按钮rightButton = new QPushButton("确认退出", this);cancelButton = new QPushButton("取消", this);// 连接按钮点击信号到相应槽函数connect(rightButton, &QPushButton::clicked, this, &ExitConfirmDialog::onRightButtonClicked);connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject);// 创建圆形部件circleWidget = new ColorCircleWidget(this);circleWidget->setFixedSize(150, 150);circleWidget->setAttribute(Qt::WA_TransparentForMouseEvents); // 设置鼠标穿透// 创建主布局QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->addWidget(messageLabel, 0, Qt::AlignTop | Qt::AlignHCenter);// 创建圆形布局QVBoxLayout *circleLayout = new QVBoxLayout;circleLayout->addStretch();circleLayout->addWidget(circleWidget, 0, Qt::AlignHCenter);circleLayout->addStretch();mainLayout->addLayout(circleLayout);// 创建按钮布局QHBoxLayout *buttonLayout = new QHBoxLayout;buttonLayout->addWidget(cancelButton);buttonLayout->addStretch();buttonLayout->addWidget(rightButton);mainLayout->addLayout(buttonLayout);setLayout(mainLayout);// 设置鼠标跟踪setMouseTracking(true);rightButton->setMouseTracking(true);cancelButton->setMouseTracking(true);circleWidget->setMouseTracking(true);
}ExitConfirmDialog::~ExitConfirmDialog()
{// 析构函数,这里没有动态分配的资源需要手动释放,Qt会自动处理
}// 从渐变中获取指定位置的颜色
QColor ExitConfirmDialog::getColorFromGradient(const QLinearGradient& gradient, double position)
{position = qBound(0.0, position, 1.0);QGradientStops stops = gradient.stops();for (int i = 0; i < stops.size() - 1; ++i) {if (position >= stops[i].first && position < stops[i + 1].first) {double ratio = (position - stops[i].first) / (stops[i + 1].first - stops[i].first);QColor startColor = stops[i].second;QColor endColor = stops[i + 1].second;int red = static_cast<int>(startColor.red() + (endColor.red() - startColor.red()) * ratio);int green = static_cast<int>(startColor.green() + (endColor.green() - startColor.green()) * ratio);int blue = static_cast<int>(startColor.blue() + (endColor.blue() - startColor.blue()) * ratio);return QColor(red, green, blue);}}return stops.back().second;
}// 鼠标移动事件处理
void ExitConfirmDialog::mouseMoveEvent(QMouseEvent *event)
{updateCircleGradientBasedOnMouse();QPointF localPos = circleWidget->mapFromGlobal(QCursor::pos());circleWidget->updatePupilPosition(localPos);QDialog::mouseMoveEvent(event);
}// 鼠标进入事件处理
void ExitConfirmDialog::enterEvent(QEnterEvent *event)
{updateCircleGradientBasedOnMouse();QPointF localPos = circleWidget->mapFromGlobal(QCursor::pos());circleWidget->updatePupilPosition(localPos);QDialog::enterEvent(event);
}// 鼠标离开事件处理
void ExitConfirmDialog::leaveEvent(QEvent *event)
{QLinearGradient yellowGradient(0, 0, 0, circleWidget->height());yellowGradient.setColorAt(0, QColor(243, 203, 130));yellowGradient.setColorAt(1, QColor(243, 203, 130));circleWidget->setGradient(yellowGradient);circleWidget->setMouthExpression(1);circleWidget->resetPupilPosition(); // 眼珠复原QDialog::leaveEvent(event);
}// 根据鼠标位置更新圆形部件的渐变
void ExitConfirmDialog::updateCircleGradientBasedOnMouse()
{// 检查鼠标是否在对话框内,如果不在则直接返回if (!underMouse()) {return;}// 获取鼠标在对话框内的全局位置QPoint mousePos = mapFromGlobal(QCursor::pos());// 获取取消按钮的中心点位置QPoint cancelCenter = cancelButton->geometry().center();// 获取确认退出按钮的中心点位置QPoint rightCenter = rightButton->geometry().center();// 计算鼠标位置到取消按钮中心点的距离double distToCancel = QLineF(mousePos, cancelCenter).length();// 计算鼠标位置到确认退出按钮中心点的距离double distToRight = QLineF(mousePos, rightCenter).length();// 计算对话框对角线的长度,作为最大距离double maxDist = std::sqrt(std::pow(width(), 2) + std::pow(height(), 2));// 对鼠标到取消按钮的距离进行归一化处理,确保值在 0 到 1 之间double normalizedDistToCancel = qMin(distToCancel / maxDist, 1.0);// 对鼠标到确认退出按钮的距离进行归一化处理,确保值在 0 到 1 之间double normalizedDistToRight = qMin(distToRight / maxDist, 1.0);// 计算取消按钮的权重,距离越近权重越大double weightCancel = 0.70 - normalizedDistToCancel;// 计算确认退出按钮的权重,距离越近权重越大double weightRight = 0.70 - normalizedDistToRight;// 计算总权重double totalWeight = weightCancel + weightRight;// 如果总权重大于 0,则对两个按钮的权重进行归一化处理if (totalWeight > 0) {weightCancel /= totalWeight;weightRight /= totalWeight;}// 使用 InOutQuad 曲线对取消按钮的权重进行平滑处理QEasingCurve easing(QEasingCurve::InOutQuad);double smoothWeightCancel = easing.valueForProgress(weightCancel);// 根据平滑后的取消按钮权重设置圆形部件的嘴巴表情circleWidget->setMouthExpression(smoothWeightCancel);// 如果平滑后的取消按钮权重超过 0.8,则将圆形部件的渐变设置为纯黄色if (smoothWeightCancel > 0.80) {QLinearGradient yellowGradient(0, 0, 0, circleWidget->height());yellowGradient.setColorAt(0, QColor(243, 203, 130));yellowGradient.setColorAt(1, QColor(243, 203, 130));circleWidget->setGradient(yellowGradient);return;}// 创建一个绿黄渐变对象QLinearGradient greenYellowGradient(0, 0, 0, circleWidget->height());greenYellowGradient.setColorAt(0, QColor(118, 174, 141));greenYellowGradient.setColorAt(0.8, QColor(243, 203, 130));greenYellowGradient.setColorAt(1, QColor(243, 203, 130));// 创建一个混合渐变对象,用于存储最终的渐变QLinearGradient mixedGradient(0, 0, 0, circleWidget->height());// 遍历渐变的起始和结束位置(0 到 1)for (int y = 0; y <= 1; y += 1) {// 定义左侧颜色为黄色QColor leftColor = QColor(243, 203, 130);// 从绿黄渐变中获取指定位置的颜色QColor rightColor = getColorFromGradient(greenYellowGradient, y);// 根据平滑后的取消按钮权重对左右颜色进行混合QColor mixedColor(qBound(0, int(leftColor.red() * smoothWeightCancel + rightColor.red() * (1 - smoothWeightCancel)), 255),qBound(0, int(leftColor.green() * smoothWeightCancel + rightColor.green() * (1 - smoothWeightCancel)), 255),qBound(0, int(leftColor.blue() * smoothWeightCancel + rightColor.blue() * (1 - smoothWeightCancel)), 255));// 将混合后的颜色设置到混合渐变对象的指定位置mixedGradient.setColorAt(y, mixedColor);}// 将最终的混合渐变设置到圆形部件上circleWidget->setGradient(mixedGradient);
}// 确认退出按钮点击事件处理
void ExitConfirmDialog::onRightButtonClicked()
{emit rightButtonClicked();accept();
}
ColorCircleWidget 类代码
#ifndef COLORCIRCLEWIDGET_H
#define COLORCIRCLEWIDGET_H#include <QWidget>
#include <QGradient>
#include <QPointF>class ColorCircleWidget : public QWidget
{Q_OBJECT
public:explicit ColorCircleWidget(QWidget *parent = nullptr);~ColorCircleWidget();void setMouthExpression(qreal expression);void setGradient(const QGradient &gradient);void updatePupilPosition(const QPointF& mousePos);void resetPupilPosition();protected:void paintEvent(QPaintEvent *event) override;private:QGradient m_gradient;qreal m_mouthExpression;int mouthWidth;int mouthHeight;int originalMouthWidth;bool isFirstOpen = true;QPointF leftEyeCenter;QPointF rightEyeCenter;QPointF leftPupilPos;QPointF rightPupilPos;int eyeRadius;
};#endif // COLORCIRCLEWIDGET_H
#include "ColorCircleWidget.h"
#include <QPainter>// 构造函数,初始化 ColorCircleWidget 对象
ColorCircleWidget::ColorCircleWidget(QWidget *parent) : QWidget(parent),// 初始化嘴巴表情,范围在 0 到 1 之间m_mouthExpression(0),// 初始化嘴巴宽度mouthWidth(0),// 初始化嘴巴高度mouthHeight(0),// 初始化嘴巴原始宽度originalMouthWidth(0)
{// 创建一个线性渐变对象,渐变方向从顶部到底部QLinearGradient gradient(0, 0, 0, height());// 设置渐变起始颜色gradient.setColorAt(0, QColor(243, 203, 130));// 设置渐变结束颜色gradient.setColorAt(1, QColor(243, 203, 130));// 将渐变对象赋值给成员变量 m_gradientm_gradient = gradient;// 开启鼠标跟踪功能,以便能够接收鼠标移动事件setMouseTracking(true);
}// 析构函数,由于没有动态分配的资源,这里为空
ColorCircleWidget::~ColorCircleWidget()
{
}// 设置嘴巴表情的函数
void ColorCircleWidget::setMouthExpression(qreal expression)
{// 检查传入的表情值是否与当前表情值不同if (m_mouthExpression != expression) {// 将表情值限制在 0 到 1 的范围内m_mouthExpression = qBound(0.0, expression, 1.0);// 如果原始嘴巴宽度还未初始化,则将当前嘴巴宽度赋值给原始嘴巴宽度if (originalMouthWidth == 0) {originalMouthWidth = mouthWidth;}// 根据表情值计算新的嘴巴宽度mouthWidth = static_cast<int>(originalMouthWidth * (1 - 0.5 * m_mouthExpression));// 触发重绘事件,更新界面显示update();}
}// 设置渐变的函数
void ColorCircleWidget::setGradient(const QGradient &gradient)
{// 检查传入的渐变对象是否与当前渐变对象不同if (m_gradient != gradient) {// 将传入的渐变对象赋值给成员变量 m_gradientm_gradient = gradient;// 触发重绘事件,更新界面显示update();}
}// 更新眼珠位置的函数,根据鼠标位置计算眼珠的偏移量
void ColorCircleWidget::updatePupilPosition(const QPointF& mousePos)
{// 获取窗口宽度和高度中的较小值,作为圆形的边长int side = qMin(width(), height());// 计算眼睛半径,为边长的 1/8eyeRadius = side / 8;// 计算眼睛的垂直位置,为边长的 1/3int eyeY = side / 3;// 计算左眼的水平位置int leftEyeX = side / 3 - eyeRadius;// 计算右眼的水平位置int rightEyeX = 2 * side / 3 - eyeRadius;// 计算左眼的中心点位置leftEyeCenter = QPointF(leftEyeX + eyeRadius + (width() - side) / 2, eyeY + eyeRadius + (height() - side) / 2);// 计算右眼的中心点位置rightEyeCenter = QPointF(rightEyeX + eyeRadius + (width() - side) / 2, eyeY + eyeRadius + (height() - side) / 2);// 计算鼠标位置相对于左眼中心点的偏移量QPointF leftOffset = mousePos - leftEyeCenter;// 计算鼠标位置相对于右眼中心点的偏移量QPointF rightOffset = mousePos - rightEyeCenter;// 计算左眼偏移量的长度double leftLength = std::sqrt(leftOffset.x() * leftOffset.x() + leftOffset.y() * leftOffset.y());// 计算右眼偏移量的长度double rightLength = std::sqrt(rightOffset.x() * rightOffset.x() + rightOffset.y() * rightOffset.y());// 定义左眼偏移量的最大长度double leftMaxLength = eyeRadius / 2;// 定义右眼偏移量的最大长度double rightMaxLength = eyeRadius / 2;// 如果左眼偏移量的长度超过最大长度,则对偏移量进行缩放if (leftLength > leftMaxLength) {leftOffset *= leftMaxLength / leftLength;}// 如果右眼偏移量的长度超过最大长度,则对偏移量进行缩放if (rightLength > rightMaxLength) {rightOffset *= rightMaxLength / rightLength;}// 计算左眼眼珠的最终位置leftPupilPos = leftEyeCenter + leftOffset;// 计算右眼眼珠的最终位置rightPupilPos = rightEyeCenter + rightOffset;// 触发重绘事件,更新界面显示update();
}// 重置眼珠位置的函数,将眼珠位置恢复到初始状态
void ColorCircleWidget::resetPupilPosition()
{// 获取窗口宽度和高度中的较小值,作为圆形的边长int side = qMin(width(), height());// 计算眼睛半径,为边长的 1/8eyeRadius = side / 8;// 计算眼睛的垂直位置,为边长的 1/3int eyeY = side / 3;// 计算左眼的水平位置int leftEyeX = side / 3 - eyeRadius;// 计算右眼的水平位置int rightEyeX = 2 * side / 3 - eyeRadius;// 计算左眼的中心点位置leftEyeCenter = QPointF(leftEyeX + eyeRadius + (width() - side) / 2, eyeY + eyeRadius + (height() - side) / 2);// 计算右眼的中心点位置rightEyeCenter = QPointF(rightEyeX + eyeRadius + (width() - side) / 2, eyeY + eyeRadius + (height() - side) / 2);// 将左眼眼珠位置重置为左眼中心点位置leftPupilPos = leftEyeCenter;// 将右眼眼珠位置重置为右眼中心点位置rightPupilPos = rightEyeCenter;// 触发重绘事件,更新界面显示update();
}// 绘制事件处理函数,当需要重绘界面时调用
void ColorCircleWidget::paintEvent(QPaintEvent *event)
{// 忽略事件参数,因为在本函数中不需要使用Q_UNUSED(event);// 创建一个 QPainter 对象,用于绘制图形QPainter painter(this);// 开启抗锯齿功能,使绘制的图形更加平滑painter.setRenderHint(QPainter::Antialiasing);// 获取窗口宽度和高度中的较小值,作为圆形的边长int side = qMin(width(), height());// 计算圆形的绘制区域QRectF rect((width() - side) / 2, (height() - side) / 2, side, side);// 创建一个画刷对象,使用当前的渐变填充QBrush brush(m_gradient);// 设置画刷painter.setBrush(brush);// 不使用画笔,即绘制的图形没有边框painter.setPen(Qt::NoPen);// 绘制圆形painter.drawEllipse(rect);// 创建一个画笔对象,设置颜色和宽度QPen pen(QColor(233, 200, 127), 1);// 设置画笔painter.setPen(pen);// 不使用画刷,即绘制的图形没有填充颜色painter.setBrush(Qt::NoBrush);// 绘制圆形的边框painter.drawEllipse(rect.adjusted(0.5, 0.5, -0.5, -0.5));// 计算眼睛半径,为边长的 1/8eyeRadius = side / 8;// 计算眼睛的垂直位置,为边长的 1/3int eyeY = side / 3;// 计算左眼的水平位置int leftEyeX = side / 3 - eyeRadius;// 计算右眼的水平位置int rightEyeX = 2 * side / 3 - eyeRadius;// 如果原始嘴巴宽度还未初始化,则将嘴巴宽度初始化为边长的 1/3,并将其赋值给原始嘴巴宽度if (originalMouthWidth == 0) {mouthWidth = side / 3;originalMouthWidth = mouthWidth;}// 计算嘴巴的高度,为边长的 1/10mouthHeight = side / 10;// 计算嘴巴的垂直位置,为边长的 2/3int mouthY = 2 * side / 3;// 计算嘴巴的水平位置int mouthX = side / 2 - mouthWidth / 2;// 设置画刷为白色,用于绘制眼睛的白色部分painter.setBrush(Qt::white);// 不使用画笔,即绘制的图形没有边框painter.setPen(Qt::NoPen);// 计算左眼的绘制区域QRectF leftEyeRect(leftEyeX + (width() - side) / 2, eyeY + (height() - side) / 2, 2 * eyeRadius, 2 * eyeRadius);// 绘制左眼的白色部分painter.drawEllipse(leftEyeRect);// 设置画刷为黑色,用于绘制左眼的眼珠painter.setBrush(Qt::black);// 如果左眼眼珠位置为空,则将其初始化为左眼中心点位置if (leftPupilPos.isNull()) {leftPupilPos = QPointF(leftEyeX + eyeRadius + (width() - side) / 2, eyeY + eyeRadius + (height() - side) / 2);}// 计算左眼眼珠的绘制区域QRectF leftPupilRect(leftPupilPos.x() - eyeRadius / 2, leftPupilPos.y() - eyeRadius / 2, eyeRadius, eyeRadius);// 绘制左眼的眼珠painter.drawEllipse(leftPupilRect);// 设置画刷为白色,用于绘制右眼的白色部分painter.setBrush(Qt::white);// 不使用画笔,即绘制的图形没有边框painter.setPen(Qt::NoPen);// 计算右眼的绘制区域QRectF rightEyeRect(rightEyeX + (width() - side) / 2, eyeY + (height() - side) / 2, 2 * eyeRadius, 2 * eyeRadius);// 绘制右眼的白色部分painter.drawEllipse(rightEyeRect);// 设置画刷为黑色,用于绘制右眼的眼珠painter.setBrush(Qt::black);// 如果右眼眼珠位置为空,则将其初始化为右眼中心点位置if (rightPupilPos.isNull()) {rightPupilPos = QPointF(rightEyeX + eyeRadius + (width() - side) / 2, eyeY + eyeRadius + (height() - side) / 2);}// 计算右眼眼珠的绘制区域QRectF rightPupilRect(rightPupilPos.x() - eyeRadius / 2, rightPupilPos.y() - eyeRadius / 2, eyeRadius, eyeRadius);// 绘制右眼的眼珠painter.drawEllipse(rightPupilRect);// 创建一个画笔对象,设置颜色和宽度,用于绘制嘴巴QPen mouthPen(QColor(139, 0, 0), 2);// 设置画笔painter.setPen(mouthPen);// 设置画刷为红色,用于填充嘴巴painter.setBrush(QColor(255, 0, 0));// 计算嘴巴的绘制区域QRectF mouthRect(mouthX + (width() - side) / 2, mouthY + (height() - side) / 2, mouthWidth, mouthHeight);// 绘制带有圆角的矩形作为嘴巴painter.drawRoundedRect(mouthRect, 7, 7);// 如果是第一次打开,则设置嘴巴表情为 1,并将标志位设置为 falseif (isFirstOpen) {setMouthExpression(1);isFirstOpen = false;}
}相关文章:
【Qt】可爱的窗口关闭确认弹窗实现
文章目录 实现思路界面构建交互逻辑实现颜色渐变处理圆形部件绘制 代码在主窗口的构造函数中创建弹窗实例ExitConfirmDialog 类代码ColorCircleWidget 类代码 今天在Qt实现了这样一个可互动的窗口(上图由于录屏工具限制没有录制到鼠标) 实现…...
服务器通过 ollama 运行deepseek r1
1、服务器环境简介 56核 CPU64G 内存无显卡已安装 Ollama 2、下载模型与配置 正常可以通过 ollama pull 或 ollama run 命令直接下载,但通常会遇到连接超时、找不到网址等总理。因此,可以使用国内的模型站进行下载,在这里使用魔塔查找模型…...
计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
自制操作系统前置知识汇编学习
今天要做什么? 为了更好的理解书中内容,需要学习下进制分析和汇编。 汇编语言其实应该叫叫机器指令符号化语言,目前的汇编语言是学习操作系统的基础。 一:触发器 电路触发器的锁存命令默认是断开的,是控制电路触发器…...
Unity制作游戏——前期准备:Unity2023和VS2022下载和安装配置——附安装包
1.Unity2023的下载和安装配置 (1)Unity官网下载地址(国际如果进不去,进国内的官网,下面以国内官网流程为例子) unity中国官网:Unity中国官网 - 实时内容开发平台 | 3D、2D、VR & AR可视化 …...
深度学习(5)-卷积神经网络
我们将深入理解卷积神经网络的原理,以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例,它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过,当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单…...
LeetCodehot 力扣热题100 课程表
题目背景 这个问题要求我们判断是否可以完成所有课程的学习。每门课程可能依赖其他课程作为前置课程,构成了一个有向图。我们需要确定是否存在环,若存在环,说明课程之间互相依赖,无法完成所有课程;如果不存在环&#x…...
彻底卸载kubeadm安装的k8s集群
目录 一、删除资源 二、停止k8s服务 三、重置集群 四、卸载k8s安装包 五、清理残留文件和目录 六、删除k8s相关镜像 七、重启服务器 一、删除资源 # 删除集群中的所有资源,包括 Pod、Deployment、Service,任意节点执行 kubectl delete --all pod…...
【HarmonyOS Next】拒绝权限二次申请授权处理
【HarmonyOS Next】拒绝权限二次申请授权处理 一、问题背景: 在鸿蒙系统中,对于用户权限的申请,会有三种用户选择方式: 1.单次使用允许 2.使用应用期间(长时)允许 3.不允许 当用户选择不允许后࿰…...
便携式动平衡仪Qt应用层详细设计方案(基于Qt Widgets)
便携式动平衡仪Qt应用层详细设计方案(基于Qt Widgets) 版本:1.0 日期:2023年10月 一、系统概述 1.1 功能需求 开机流程:长按电源键启动,全屏显示商标动画(快闪3~4次)。主界面&…...
2 20 数据开发面试题汇总
下面是我在实习中协助面试 然后在牛客上挑选了一些完整的面试问题借助豆包完成的面经答案思路汇总 滴滴数据研发日常实习 一面 数据仓库认识维度建模之外还有哪些建模,有什么区别项目中数据仓库分了哪几层,为什么要分层Hadoop架构,你这些组…...
跟着李沐老师学习深度学习(十四)
注意力机制(Attention) 引入 心理学角度 动物需要在复杂环境下有效关注值得注意的点心理学框架:人类根据随意线索和不随意线索选择注意力 注意力机制 之前所涉及到的卷积、全连接、池化层都只考虑不随意线索而注意力机制则显示的考虑随意…...
Websocket——心跳检测
1. 前言:为什么需要心跳机制? 在现代的实时网络应用中,保持客户端和服务端的连接稳定性是非常重要的。尤其是在长时间的网络连接中,存在一些异常情况,导致服务端无法及时感知到客户端的断开,可能造成不必要…...
基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Spring Boot3.x集成Flowable7.x(一)Spring Boot集成与设计、部署、发起、完成简单流程
一、Flowable简介 Flowable 是一个轻量级、开源的业务流程管理(BPM)和工作流引擎,旨在帮助开发者和企业实现业务流程的自动化。它支持 BPMN 2.0 标准,适用于各种规模的企业和项目。Flowable 的核心功能包括流程定义、流程执行、任…...
Dify 工作流分类器技巧
在使用 Dify 工作流中的分类器(如问题分类器,Question Classifier)时,想要实现高效且准确的分类,可以遵循以下技巧和最佳实践。这些建议基于 Dify 的工作流功能,帮助你更好地设计和优化分类过程:…...
网络安全-openssl工具
OpenSSl是一个开源项目,包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准,并且拥有比较长的历史,现在几乎所有的服务器软件和很多客户端都在使用openssl,其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…...
【Web开发】PythonAnyWhere免费部署Django项目
PythonAnyWhere免费部署Django项目 文章目录 PythonAnyWhere免费部署Django项目将项目上传到GitHub从GitHub下载Django项目创建Web应用配置静态文件将项目上传到GitHub 打开项目,输入以下命令,生成Django项目依赖包。pip list --format=freeze > requirements.txt打开Git …...
Spring Boot 多模块怎么统一管理
在 Spring Boot 中,多模块项目是一种常见的架构模式,尤其适用于构建大型、复杂的应用程序。将应用程序拆分成多个模块可以提高代码的可维护性、可重用性和团队协作效率。然而,多模块项目也带来了一些管理上的挑战,例如依赖版本管理…...
视频的分片上传
分片上传需求分析: 项目中很多地方需要上传视频,如果视频很大,上传到服务器需要很多时间 ,这个时候体验就会很差。所以需要前端实现分片上传的功能。 要实现分片上传,需要对视频进行分割,分割成不同的大小…...
Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
前言 在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...
Deepseek首页实现 HTML
人工智能与未来:机遇与挑战 引言 在过去的几十年里,人工智能(AI)技术取得了突飞猛进的发展。从语音助手到自动驾驶汽车,AI 正在深刻地改变我们的生活方式、工作方式以及社会结构。然而,随着 AI 技术的普及…...
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
前言 人工智能技术的爆发式发展催生了多样化的AI模型生态,从通用对话到垂直领域应用,从数据挖掘到创意生成,各模型凭借其独特的技术优势与场景适配性,正在重塑全球产业格局。本文将以DeepSeek、ChatGPT、XAI(可解释人…...
VS2022配置FFMPEG库基础教程
1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年,由法国工程师Fabrice Bellard主导开发,其名称源自"Fast Forward MPEG",初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护,逐步发展成为包含音视频采…...
kafka基本知识
什么是 Kafka? Apache Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的一部分。Kafka 主要用于构建实时数据管道和流处理应用程序。它能够高效地处理大量的数据流,广泛应用于日志收集、数…...
类型系统下的语言分类与类型系统基础
类型系统是一种根据计算值的种类对程序语法进行分类的方式,目的是自动检查是否有可能导致错误的行为。 —Benjamin.C.Pierce,《类型与编程语言》(2002) 每当谈到编程语言时,人们常常会提到“静态类型”和“动态类型”。…...
力扣-回溯-93 复原IP地址
思路 用一个vector存放可能的结果,然后用一个变量判断插入点的数量,假设再最后一段后也插入点 代码 class Solution { public:vector<string> result;vector<string> path;int toNum(string s){int d 1;int result 0;for(int i s.size…...
SpringSecurity设置白名单
Spring Security 访问权限系列文章: 《SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器》 《SpringSecurity基于注解实现方法级别授权:PreAuthorize、PostAuthorize、Secured》 《SpringSecurity设置白名单》 白名单࿰…...
有没有使用wxpython开发的类似于visio或drawio的开源项目(AI生成)
有没有使用wxpython开发的类似于visio或drawio的开源项目 是的,有一些使用wxPython开发的类似于Microsoft Visio或draw.io(现为diagrams.net)的开源项目。wxPython 是一个跨平台的GUI工具包,它允许Python开发者创建桌面应用程序&…...
HTML之JavaScript DOM操作元素(2)
HTML之JavaScript DOM操作元素(2) 4.增删元素var element document.createElement("元素名") 创建新元素父元素.appendChild(子元素) 在父元素中追加子元素父元素.insertBefore(新元素,参照元素) 在特定元素之前新增元…...
