Qt 窗口与部署应用程序发布包 day6

Qt 窗口与部署应用程序发布包 day6

QWidget

  • QWidget是所有可视控件的基类,每个控件都是矩形按照Z轴顺序排序
  • 如果控件没有父控件,则称为窗口

设置exe窗口图标

  • 在项目文件中新建一个文件夹Resource,来存放图标文件
    在这里插入图片描述
    在这里插入图片描述
第一种方法
  • 用绝对路径设置图标,但是这种不能分享到他人使用,会丢失路径
//设置窗口图标
setWindowIcon(QIcon("F:\\vs2022EngineFile\\QtVsProject\\Resource\\tubiao.ico"));
第二种方法
  • 使用资源系统,将图标链接到exe中,可以实现跨平台

  • 在vs中是没有办法创建资源文件的我们可以手动创建一个空的.qrc文件,然后打开。

  • 但是vs并没有单独打开qrc文件的程序,不过有带打开qrc文件的插件,下载这个插件,然后把他拷贝到你的按照Qt目录的msvc套件的bin目录中
    在这里插入图片描述
    在这里插入图片描述

  • 然后去vs的拓展里面下载Qt Visual Studio Tools这个插件
    在这里插入图片描述

  • 现在就可以打开这个qrc资源文件了
    在这里插入图片描述

  • 选择添加前缀
    在这里插入图片描述

  • 在选择添加文件,添加当那个需要添加的图标即可,图标的名字不能有中文,否则会出bug
    在这里插入图片描述
    在这里插入图片描述

  • 然后进入CMAkeLists.txt,将这个资源文件添加进项目
    在这里插入图片描述

  • 然后将资源文件添加的图标那个路径复制,用setWindowIcon进行设置图标即可

#include<QApplication>
#include <QWidget>
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent){//设置窗口标题this->setWindowTitle("小瓜");//设置窗口图标 绝对路径//setWindowIcon(QIcon("F:\\vs2022EngineFile\\QtVsProject\\Resource\\图标.ico"));//使用资源文件进行设置窗口图标setWindowIcon(QIcon(":/Resource/tubiao.ico"));}
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述
  • 资源文件不要放很大的文件,很大的文件设置为相对路径
第三种方法
  • 使用相对路径,一般使用这种路径,当删除缓存重新配置CMAkeLists.txt就把资源文件给删除
  • 添加一个头文件 #include <QDir>
  • 使用相对路径的话我们要将Resource放到这个目录下,才能进行设置
    在这里插入图片描述
    在这里插入图片描述
  • 然后进行设置图标
#include<QApplication>
#include <QWidget>
#include <QDir>
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent){//设置窗口标题this->setWindowTitle("小瓜");//设置窗口图标 绝对路径//setWindowIcon(QIcon("F:\\vs2022EngineFile\\QtVsProject\\Resource\\图标.ico"));//使用资源文件进行设置窗口图标//setWindowIcon(QIcon(":/Resource/tubiao.ico"));//相对路径setWindowIcon(QIcon("Resource\\tubiao.ico"));//返回当前程序的绝对路径qDebug() << QDir::currentPath();}
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

窗口大小和位置

  • 设置窗口标题
//设置窗口标题
this->setWindowTitle("小瓜");
  • 获取窗口大小与位置
//窗口大小、位置
qDebug() << width() << height() << size();
//在窗口没有创建之前,获取的坐标总是0
qDebug() << geometry() << frameGeometry() << rect();
  • 设置窗口大小
//设置窗口大小
resize(400, 400);
  • 设置窗口位置,以边框为变化点
//设置窗口位置,以边框为变化点
move(0, 0);
  • 设置固定窗口大小(无法拖拽)
//设置固定窗口大小
setFixedSize(400, 400);
  • 设置窗口最大、最小限制(同时设置两个就会和设置固定大小一样)
//设置最大、最小大小
setMinimumSize(400, 400);
setMaximumSize(400, 400);
  • 设置几何,以客户区为变换点
//设置几何,以客户区为变换点
setGeometry(50, 50, 100, 100);
#include <QApplication>
#include <QWidget>
#include <QDir>
#include <QPushButton>
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent),btn(new QPushButton("按钮",this)){//设置窗口标题this->setWindowTitle("小瓜");//使用资源文件进行设置窗口图标setWindowIcon(QIcon(":/Resource/tubiao.ico"));//窗口大小、位置qDebug() << width() << height() << size();//在窗口没有创建之前,获取的坐标总是0qDebug() << geometry() << frameGeometry() << rect();//连接信号connect(btn, &QPushButton::clicked, this, [=](){qDebug() << geometry() << frameGeometry() << rect();});//设置窗口大小resize(400, 400);设置窗口位置,以边框为变化点//move(0, 0);设置固定窗口大小//setFixedSize(400, 400);设置最大、最小大小//setMinimumSize(400, 400);//setMaximumSize(400, 400);//设置几何,以客户区为变换点setGeometry(50, 50, 100, 100);}
protected:QPushButton* btn{};
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

窗口显示

  • 窗口最大化:showMaximized();
  • 窗口最小化:showMinimized();
  • 窗口全屏:showFullScreen();
  • 窗口关闭:close();
  • 判断窗口是否最大化:isMaximized();
  • 判断窗口是否全屏:isFullScreen();
  • 恢复正常窗口:showNormal();
#include <QApplication>
#include <QWidget>
#include <QDir>
#include <QPushButton>
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent),btn(new QPushButton("按钮",this)),m_colseScreen(new QPushButton("X",this)),m_max(new QPushButton("□",this)),m_min(new QPushButton("_",this)),m_fullScreen(new QPushButton("■",this))	{//设置窗口大小resize(400, 400);//设置窗口标题this->setWindowTitle("小瓜");//使用资源文件进行设置窗口图标setWindowIcon(QIcon(":/Resource/tubiao.ico"));//设置按钮固定大小m_colseScreen->setFixedSize(32, 32);m_max->setFixedSize(32, 32);m_min->setFixedSize(32, 32);m_fullScreen->setFixedSize(32, 32);//设置按钮位置m_colseScreen->move(width() - m_colseScreen->width(), 0);m_max->move(width() - m_max->width() * 2, 0);m_min->move(width() - m_min->width() * 3, 0);m_fullScreen->move(width() - m_fullScreen->width() * 4, 0);//连接信号connect(m_colseScreen, &QPushButton::clicked, this, [=](){//关闭窗口close();});connect(m_max, &QPushButton::clicked, this, [=](){//判断窗口是不是最大化if (isMaximized()){//恢复窗口,正常化showNormal();}else{//最大化窗口showMaximized();}});connect(m_min, &QPushButton::clicked, this, [=](){//最小化窗口showMinimized();});connect(m_fullScreen, &QPushButton::clicked, this, [=](){//判断是否是全屏if (isFullScreen()){//恢复正常showNormal();}else{//全屏showFullScreen();}});}
protected:QPushButton* btn{};QPushButton* m_max{};QPushButton* m_min{};QPushButton* m_fullScreen{};QPushButton* m_colseScreen{};
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

窗口关闭隐藏

  • 设置属性,让窗口调用close时,自动销毁
newWidget->setAttribute(Qt::WA_DeleteOnClose);
#include <QApplication>
#include <QWidget>
#include <QDir>
#include <QPushButton>
#include <QPointer>
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent), btn(new QPushButton("按钮", this)), m_close(new QPushButton("destroyed", this)), newWidget(new QWidget){//设置窗口大小resize(400, 400);//设置窗口标题this->setWindowTitle("小瓜");//使用资源文件进行设置窗口图标setWindowIcon(QIcon(":/Resource/tubiao.ico"));connect(btn, &QPushButton::clicked, this, [=](){//判断这个窗口是否隐藏if (newWidget->isHidden()){//显示这个窗口newWidget->show();}else{//隐藏这个窗口newWidget->hide();}});//设置按钮右对齐m_close->move(width() - m_close->width(), 0);connect(newWidget, &QPushButton::destroyed, [=](){qDebug() << "destroyed";});//设置属性,让窗口调用close时,自动销毁newWidget->setAttribute(Qt::WA_DeleteOnClose);connect(m_close, &QPushButton::clicked, this, [=](){if (newWidget){//如果程序存在多个窗口,那么关闭某一个窗口时,不是关闭是隐藏newWidget->close();//隐藏窗口//释放这个指针也能销毁,就可以不用使用close与设置属性了//newWidget->deleteLater();}else{qDebug() << "newWidget is null";}});//显示这个窗口newWidget->show();}protected:QPushButton* btn{};QPushButton* m_close{};//为了更安全,我们一般在这用智能指针释放更安全QPointer<QWidget> newWidget{};
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

CMake管理多个项目

  • 创建两个项目,然后在项目外面创建一个CMAkeLists.txt
    在这里插入图片描述
  • 然后用vs打开这个目录,然后将这两个项目中的CMAkeLists中项目名改成这个当前项目的名字
    在这里插入图片描述
    在这里插入图片描述
  • 然后在最外层的CMAkeLists中添加这三行代码即可
# 需求最低版本号
cmake_minimum_required(VERSION 3.24)# 设置项目名
project(Project)# 添加子目录
add_subdirectory(ProjectTwo)
add_subdirectory(ProjectOne)

在这里插入图片描述

  • 现在就可以选择两个项目中的任意一个了
    在这里插入图片描述

QDialog

  • 对话框窗口是一个顶级窗口,主要用于短期任务和与用户的简短通信。对话框可以是模态的也可以是非模态的。QDialog可以提供返回值,并且它们可以具有默认按钮。
  • 对话框有两种模式:模态对话框、非模态对话框。
    • 模态对话框会阻止输入到同一应用程序其他的可见窗口的对话框
      • 窗口模式
      • 应用程序模式
    • 非模态对话框是独立于其他窗口运行的对话框
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDialog>
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent), btn(new QPushButton("模态对话框(应用程序级别)", this)), btn2(new QPushButton("显示半模态对话框(窗口级别)", this)), btn3(new QPushButton("显示非模态对话框", this)){resize(800, 300);btn->setFixedSize(200, btn->height());btn2->setFixedSize(200, btn2->height());btn3->setFixedSize(200, btn3->height());btn2->move(btn->width(), 0);btn3->move(btn->width() * 2, 0);//显示模态对话框connect(btn, &QPushButton::clicked,this,[](){//显示对话框QDialog loginDlg2;//阻塞程序执行loginDlg2.exec();});//显示半模态对话框connect(btn2, &QPushButton::clicked, this, [](){//显示对话框QDialog loginDlg;//这个必须设置为成员变量才行,否则直接销毁了,但是不经常使用//不会阻塞程序执行,但是会阻塞窗口的消息,在消息层面会模态对话框一样(不让操作)loginDlg.open();		});//显示非模态对话框connect(btn3, &QPushButton::clicked, this, [this](){//不阻塞,使用这个就必须QDialog是成员变量,否则看不见效果 loginDlg.show();});}protected:QPushButton* btn{};QPushButton* btn2{};QPushButton* btn3{};QDialog loginDlg;
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述
  • 模态对话框会有个返回值
    在这里插入图片描述
  • 对话框的默认按钮是用户按Enter(返回)键时按下的按钮。此按钮用于表示用户接受对话框的设置并希望关闭对话框。使用QPushButton::setDefault(), QPushButton::isDefault()和QPushButton::autoDefault()来设置和控制对话框的默认按钮。
  • 如果用户在对话框中按Esc键,QDialog::reject()将被调用。这将导致窗口关闭:关闭事件不能被忽略。
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDialog>class Dialog :public QDialog
{Q_OBJECT
public:Dialog(QWidget* parent = nullptr) :QDialog(parent), btn(new QPushButton("确认", this)), btn2(new QPushButton("取消", this)){btn2->move(160, 0);btn2->setDefault(true);//把取消设置为默认按钮,当按下回车,自动执行取消键connect(btn, &QPushButton::clicked, this, [=](){//accept();//done可以任意发送一个整型数据done(QDialog::Accepted);});connect(btn2, &QPushButton::clicked, this, [=](){//rejected();//close();//比如我想拿到数据,因为窗口是阻塞的。为什么能获取数据,因为窗口结束了后,直接就结束了,都等不到信号与槽done(QDialog::Rejected);data = "小瓜";});}//提供接口呗QString getData() const{return data;}
protected:QPushButton* btn{};QPushButton* btn2{};QString data;
};
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent), btn(new QPushButton("模态对话框(应用程序级别)", this)), btn2(new QPushButton("显示半模态对话框(窗口级别)", this)), btn3(new QPushButton("显示非模态对话框", this)){resize(800, 300);btn->setFixedSize(200, btn->height());btn2->setFixedSize(200, btn2->height());btn3->setFixedSize(200, btn3->height());btn2->move(btn->width(), 0);btn3->move(btn->width() * 2, 0);//显示模态对话框connect(btn, &QPushButton::clicked,this,[](){//显示对话框Dialog loginDlg2;//阻塞程序执行int value = loginDlg2.exec();if (value == QDialog::Accepted){qDebug() << "Accepted";}else{qDebug() << "Rejecet" << loginDlg2.getData();}});//显示半模态对话框connect(btn2, &QPushButton::clicked, this, [](){//显示对话框QDialog loginDlg;//这个必须设置为成员变量才行,否则直接销毁了,但是不经常使用//不会阻塞程序执行,但是会阻塞窗口的消息,在消息层面会模态对话框一样(不让操作)loginDlg.open();		});//显示非模态对话框connect(btn3, &QPushButton::clicked, this, [this](){//不阻塞,使用这个就必须QDialog是成员变量,否则看不见效果 loginDlg.show();});}protected:QPushButton* btn{};QPushButton* btn2{};QPushButton* btn3{};QDialog loginDlg;
};
int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

设置应用程序exe图标

  • 设置完窗口图标之后,我们可能需要设置可执行程序exe文件的图标
  • 这个图标的格式必须是ico
  • 创建一个图标格式(ico)的文件,可以将一个普通的图片转成.ico格式的图标文件,图片格式在线转换
  • 将转换好的ico文件放到源文件所在目录,即和CMakeLists.txt文件同级目录,并创建名为icon.rc的文件,用文本编辑器打开这个icon.rc文件写入如下内容。zay是你自己的图标名字
IDI_ICON1 ICON DISCARDABLE "zay.ico"
  • 最后在CMakeLists.txt中添加你的这个icon.rc文件即可
    在这里插入图片描述
  • 然后运行代码即可
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
  • 而且一般设置了应用程序图标,你没有设置窗口图标,它会默认设置窗口图标为应用程序图标
    在这里插入图片描述

Qt部署应用程序发布包

windeployqt

  • windeployqt.exe是Qt自带的工具,用于创建应用程序发布包。 简单来说,这个工具可以自动地将某程序依赖的库、资源拷贝到其所在目录,防止程序在其他电脑上运行报找不到库的错误。
  • 打开对应Qt命令行的终端
    在这里插入图片描述
  • 然后再命令行中输入windeployqt AppNameAppName表示应用程序完整路径
  • 我们知道,Qt项目路径不能包含中文,所以为了保险起见,应用程序路径中不要包含中文。另外,如果应用程序路径中包含空格,需要用双引号将整个路径字符串包裹起来。
  • 调用vcvarsall.bat来进行环境设置,vcvarsall.bat是VS自带的配置环境变量的批处理文件。它的位置取决你的安装位置。这样发布出来的目录就带上了VS的依赖库,拷贝到没有安装VS的电脑上亦可以运行。
  • 找到这个程序
    在这里插入图片描述
  • 执行这个程序
    在这里插入图片描述
  • 安装成功
    在这里插入图片描述
  • 现在就可以来部署项目程序了,首先到项目的out-build-x64-Debug路径下,找到exe项目执行程序,创建一个文件夹方便操作,把项目exe拖进去
    在这里插入图片描述
    在这里插入图片描述
  • 打开Qt命令行终端进入到这个路径,输入命令windeployqt加exe项目程序名即可开始部署
    在这里插入图片描述
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
    在这里插入图片描述
  • 一般要部署应该在release模式下进行,部署步骤与这个debug模式一样的,此时就可以将这些文件打包给别人也可以运行
  • release模式下
    在这里插入图片描述

在这里插入图片描述

Inno Setup

安装Inno Setup

  • 进入官网下载Inno Setup,Inno Setup官网
    在这里插入图片描述

Inno Setup程序打包

第1步
  • 创建新文件
    在这里插入图片描述
第2步
  • 欢迎界面直接下一步
    在这里插入图片描述
第3步
  • 程序信息填写:程序名称、版本号、公司名称、网站,填写完后,点击下一步
    在这里插入图片描述
第4步
  • 设置安装目录,直接下一步即可
    在这里插入图片描述
第5步
  • 添加需要打包的程序及依赖文件
    在这里插入图片描述
第6步
  • 应用程序文件关联,如果你的程序用打开某个后缀文件的功能,而且你希望用你的程序打开,则可以勾选关联,并指定关联的文件后缀名
    在这里插入图片描述
第7步
  • 快捷方式,这里默认勾选了开始菜单、桌面快捷方式。
    在这里插入图片描述
第8步
  • 程序文档:在安装过程中会打开文档展示给用户看
    在这里插入图片描述
第9步
  • 安装模式(默认是管理员模式)
    在这里插入图片描述
第10步
  • 安装语言,很遗憾没有中文,后面会补进一个中文插件就设置为中文
    在这里插入图片描述
第11步
  • 编译设置
    在这里插入图片描述
第12步
  • 使用Inno Setup 处理器
    在这里插入图片描述
第13步
  • 脚本创建完成
    在这里插入图片描述
第14步
  • 完成之后,会询问是否立即编译脚本,我们现在可以选择否,看看脚本有没有什么问题或者需要更改的地方
    在这里插入图片描述
第15步
  • 现在运行编译一下,还会问你,是否保存脚本?点击是,然后选择一个位置保存即可!
    在这里插入图片描述
出现问题解决方案图标过大问题
  • 报错了,盲猜是图标文件过大的问题导致,我们换个
    在这里插入图片描述
  • 果然就没问题了
    在这里插入图片描述
    在这里插入图片描述
空目录问题
  • 有时候会添加空目录也会报错,如果报错就在脚本里面,它会提示你在哪一行有问题,直接用;注释就可以
    在这里插入图片描述
目录配置路径问题
  • 现在就可以来运行这个安装程序看看会不会有问题
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
  • 运行的时候果然报错了
    在这里插入图片描述
  • 大概意思是qt的插件没有被发现,我们去装好的应用程序目录里面看看什么情况,找到这个目录发现里面的文件没有组织成目录
    在这里插入图片描述
  • 现在我们卸载这个程序
    在这里插入图片描述
  • 解决方法:自己手动更改脚本,因为当时在添加目录的时候,它默认放在外面默认当前程序下面了,我们现在就得改脚本将其放在正确位置
    在这里插入图片描述
  • 将他们的位置放对地方
    在这里插入图片描述
中文插件
  • 然后重新进行编译就没问题了,现在来解决中文安装问题,准备这个插件
    在这里插入图片描述
  • 把这个插件放入到Inno Setup的安装目录的Languages目录下
    在这里插入图片描述
  • 然后修改脚本,注释原来的默认语言,将这行代码修改上去,也就是添加语言
Name: "ChineseSimple";MessagesFile:"compiler:Languages\ChineseSimple.isl"

在这里插入图片描述

  • 然后进行编译运行安装程序即可
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

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

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

相关文章

UE4和C++ 开发--HUD类

HUD 平视显示器(Head Up Display),简称HUD。在蓝图中是指在屏幕上面绘制的二维物体。 1. 创建HUD 打开蓝图编辑器&#xff0c;创建一个蓝图类&#xff0c;搜索HUD&#xff0c;选择并命名BP_HUD。 2. 开始绘制 打开事件列表&#xff0c;右键搜索 EventReceive Draw HUD。有两…

互联网Java工程师面试题·Java 并发编程篇·第三弹

目录 26、什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f; 27、为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 27.1 为什么要使用 Executor 线程池框架 27.2 使用 Executor 线程池框架的优点 28、java 中有几种方法可以实现一个线程…

【牛客网刷题(数据结构)】:环形链表的约瑟夫问题

描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; O(n) 示例1 好环形链表的约瑟夫问题是一个经典的问…

分布式链路追踪如何跨线程

背景 我们希望实现全链路信息&#xff0c;但是代码中一般都会异步的线程处理。 解决思路 我们可以对以前的 Runable 和 Callable 进行增强。 可以使用 ali 已经存在的实现方式。 TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题 核心的实现思路如下&#…

内部类概述

一、内部类 1.内部类概述 2.内部类的四种实现形式 1.成员内部类 public class Outer {private int age99;public static String a;//成员内部类public class Inner{private int age88;private String name; // public static String school; //jdk 16开始才支持定义静态…

nvm、node、npm解决问题过程记录

在Windows10如何降级Node.js版本&#xff1a;可以尝试将Node.js版本降级到一个较旧的版本&#xff0c;以查看问题是否得以解决。可以使用Node Version Manager (nvm) 来轻松切换Node.js版本&#xff0c;具体完整步骤&#xff1a; 首先&#xff0c;需要安装Node Version Manager…

C++项目:【负载均衡式在线OJ】

文章目录 一、项目介绍 二、技术栈与开发环境 1.所用技术: 2.开发环境&#xff1a; 三、项目演示 1.运行代码 2.进入项目首页 3.题目列表 4.点击具体一道题 5.编辑代码并提交 四、项目思维导图 五、项目宏观结构 六、Comm公共模块 1.日志工具log.hpp 2.其他工具…

如何在 Spring Boot 中进行分布式追踪

在 Spring Boot 中进行分布式追踪 分布式系统中的应用程序由多个微服务组成&#xff0c;它们可以位于不同的服务器、容器或云中。当出现问题时&#xff0c;如性能瓶颈、错误或延迟&#xff0c;了解问题的根本原因变得至关重要。分布式追踪是一种用于跟踪和分析分布式应用程序性…

linux安装filebeat并收集日志到elasticsearch

摘要&#xff1a; 通过filebeat收集服务器上各个应用的日志到elasticsearch&#xff0c;通过tags区分不同的应用创建不同的索引保存日志。 官网地址&#xff1a; https://www.elastic.co/cn/downloads/past-releases#filebeat 安装步骤&#xff1a; 1&#xff1a;下载并解…

如何利用IP地址定位保护网络安全?

通过IP地址定位可以在一定程度上增强网络安全&#xff0c;但它并不是唯一的安全措施。以下是如何利用IP地址定位来保护网络安全的一些方法&#xff1a; 异常检测和入侵检测&#xff1a;监控网络上的IP地址流量&#xff0c;定位异常活动&#xff0c;如大规模的连接尝试、不寻常的…

微信浏览器大字体模式 按钮文字居中用line-height 显示异常

按钮文字居中用line-height 的css 在微信浏览器大字体模式&#xff0c;会导致显示错误。改成flex 居中就好了

对称加密和非对称加密以及CA证书

对称加密 对称加密只用到了公匙,这个公匙是消息的发送方和消息的接收方共享的,也就是消息发送方使用这个公匙对消息加密,然后接收方使用公匙对消息解密,最典型的例子比如像 encrypt 加密,比如我们有个 springboot 应用,需要对 application.yml 文件里的密码做加密,我们…

【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题

文章目录 【LeetCode高频SQL50题-基础版】打卡第8天&#xff1a;第41~45题⛅前言好友申请II&#x1f512;题目&#x1f511;题解 2016年的投资&#x1f512;题目&#x1f511;题解 部门工资前三高的所有员工&#x1f512;题目&#x1f511;题解 修复表中的名字&#x1f512;题目…

阿里云服务器不能访问网络之安装mysql 提示连接超时

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 过了一段时间后提示 fail .......time out 链接超时 有可能你的服务器不能访问网络 因为宽带套餐 我购买的时候没有购 重新购买就行了

登录中获取验证码的节流

一. 验证码框 <el-input placeholder"请输入验证码" prefix-icon"el-icon-lock" v-model"ruleForm.code"><el-button slot"suffix" :disabled"disabled" type"text" size"mini" click"ch…

今年的秋招面试,确实有点难。

不可否认的是&#xff0c;今年秋招确实有点难 从今年的形势来看&#xff0c;好的 offer 都掌握在少数人的手里&#xff0c;想要秋招找到理想的工作&#xff0c;要么学历好&#xff0c;要么技术功底很扎实&#xff0c;这两样都不占的话&#xff0c;就业压力就会比较大。 如何从…

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…

C语言水平测试题 过关斩将(3)辗转相除法,前n项求和,整数的正序分解,求最大公约数

我的个人主页&#xff1a;☆光之梦☆的博客_CSDN博客-C语言基础语法&#xff08;超详细&#xff09;领域博主 欢迎各位 &#x1f44d;点赞 ⭐收藏 &#x1f4dd;评论 我的专栏&#xff1a;C语言基础语法&#xff08;超详细&#xff09;_☆光之梦☆的博客-CSDN博客&#xff08;这…

Linux 编写一个 简单进度条

进度条 回车换行理解&#xff1a; 我们要理解&#xff0c;回车换行是两个概念&#xff1a; 换行是把光标移到下一行&#xff0c;是竖直的往下平移&#xff1b;" \n "回车是把光标移到当前行的最开始&#xff1b; " \r " 就和一起打字…

【计网】傻瓜式安装cpolar内网穿透

目录 一、注册账户 二、下载安装包 三、安装 四、查看AuthToken 五、简单使用 如果在本机部署项目外网是访问不到的&#xff0c;通过内网穿透就可以使本机部署的项目可被外网访问 一、注册账户 cpolar - secure introspectable tunnels to localhostcpolar secure intro…