QT中资源文件resourcefile的使用,使用API完成页面布局

QT中资源文件resourcefile的使用

  • 之前添加图标的方法
  • 使用资源文件的方法
    • 创建资源文件
    • 资源文件添加前缀
    • 资源文件添加资源
    • 使用资源文件中的资源
  • 使用API完成布局
    • 使用QHBoxLayout完成水平布局
    • 使用QVBoxLayout完成垂直布局
    • 使用QGridLayout完成网格布局

在Qt中引入资源文件好处在于他能提高应用程序的部署效率并且减少一些错误的发生。

在程序编译过程中, 添加到资源文件中的文件也会以二进制的形式被打包到可执行程序中,这样这些资源就永远和可执行程序捆绑到一起了,不会出现加载资源却找不到的问题。

资源文件中一般添加的都是比较小的资源,比如: 图片,配置文件,MP3 等,如果是类似视频这类比较大的文件就不适合放到资源文件中了。

之前添加图标的方法

// 创建图标对象
QIcon::QIcon(const QString &fileName);
// QWidget类的 公共成员函数
void setWindowIcon(const QIcon &icon);

// 给窗口设置图标
// 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
// 发布 exe 需要额外发布图片, 将其部署到某个目录中
setWindowIcon(QIcon("d:\\pic\\1.ico"));
// 给窗口设置图标
// 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
// 发布 exe 需要额外发布图片, 将其部署到某个目录中

完整代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QIcon"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建图标对象
    QIcon Q("C://Users//DYF//Pictures//a.png");
    // QWidget类的 公共成员函数
    this->setWindowIcon(Q);

    // 给窗口设置图标
    // 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
    // 发布 exe 需要额外发布图片, 将其部署到某个目录中
    //setWindowIcon(QIcon("d:\\pic\\1.ico"));


}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

使用资源文件的方法

创建资源文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

资源文件添加前缀

在这里插入图片描述

一个资源文件中可以添加多个前缀, 前缀就是添加的资源在资源文件中的路径, 前缀根据实际需求制定即可, 路径以 / 开头

在这里插入图片描述

资源文件添加资源

在这里插入图片描述

资源文件放到什么地方?

  1. 放到和 项目文件 .pro 同一级目录或者更深的目录中
  2. 错误的做法: 将资源文件放到 .pro文件的上级目录, 这样资源文件无法被加载到

在这里插入图片描述

使用资源文件中的资源

在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QIcon"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建图标对象
    QIcon Q(":/new/prefix1/C:/Users/DYF/Pictures/a.png");
    // QWidget类的 公共成员函数
    this->setWindowIcon(Q);

    // 给窗口设置图标
    // 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
    // 发布 exe 需要额外发布图片, 将其部署到某个目录中
    //setWindowIcon(QIcon("d:\\pic\\1.ico"));


}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

我们常用的资源文件添加方式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

就是把资源文件放在pro同一级目录或者更加深层次的目录中

对于动作中添加资源文件:
在这里插入图片描述

使用API完成布局

// 在布局最后面添加一个窗口
void QLayout::addWidget(QWidget *w);
// 将某个窗口对象从布局中移除, 窗口对象如果不再使用需要自己析构
void QLayout::removeWidget(QWidget *widget);
// 设置布局的四个边界大小, 即: 左、上、右和下的边距。
void QLayout::setContentsMargins(int left, int top, int right, int bottom);
// 设置布局中各个窗口之间的间隙大小
void setSpacing(int);

在这里插入图片描述

使用QHBoxLayout完成水平布局

// 创建符窗口对象
QWidget *window = new QWidget;
// 创建若干个子窗口对象
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

// 创建水平布局对象
QHBoxLayout *layout = new QHBoxLayout;
// 将子窗口添加到布局中
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

// 将水平布局设置给父窗口对象
window->setLayout(layout);
// 显示父窗口
window->show();

在这里插入图片描述
得到的是单独的控件

如果想让控件嵌入Mainwindow中

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QIcon"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建图标对象
    QIcon Q(":/new/prefix1/img/a.png");
    // QWidget类的 公共成员函数
    this->setWindowIcon(Q);

    // 给窗口设置图标
    // 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
    // 发布 exe 需要额外发布图片, 将其部署到某个目录中
    //setWindowIcon(QIcon("d:\\pic\\1.ico"));



    //使用API布局
    // 创建符窗口对象
    //QWidget *window1 = new QWidget();

    // 创建若干个子窗口对象
    QPushButton *button1 = new QPushButton("One");
    QPushButton *button2 = new QPushButton("Two");
    QPushButton *button3 = new QPushButton("Three");
    QPushButton *button4 = new QPushButton("Four");
    QPushButton *button5 = new QPushButton("Five");

    // 创建水平布局对象
    QHBoxLayout *layout1 = new QHBoxLayout;
    // 将子窗口添加到布局中
    layout1->addWidget(button1);
    layout1->addWidget(button2);
    layout1->addWidget(button3);
    layout1->addWidget(button4);
    layout1->addWidget(button5);

    // 将水平布局设置给父窗口对象
    this->ui->widget_3->setLayout(layout1);
    // 显示父窗口
    this->ui->widget_3->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}


对应的在Mainwindow中添加widget控件
在这里插入图片描述
最终的效果为:

在这里插入图片描述

使用QVBoxLayout完成垂直布局

    //使用API布局
    //创建垂直布局
    // 创建符窗口对象
    QWidget *window2 = new QWidget;
    // 创建若干个子窗口对象
    QPushButton *button21 = new QPushButton("One");
    QPushButton *button22 = new QPushButton("Two");
    QPushButton *button23 = new QPushButton("Three");
    QPushButton *button24 = new QPushButton("Four");
    QPushButton *button25 = new QPushButton("Five");

    // 创建垂直布局对象
    QVBoxLayout *layout2 = new QVBoxLayout;
    // 将子窗口添加到布局中
    layout2->addWidget(button21);
    layout2->addWidget(button22);
    layout2->addWidget(button23);
    layout2->addWidget(button24);
    layout2->addWidget(button25);

    // 将水平布局设置给父窗口对象
    window2->setLayout(layout2);
    // 显示父窗口
    window2->show();

在这里插入图片描述

嵌入到主窗口中:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QIcon"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建图标对象
    QIcon Q(":/new/prefix1/img/a.png");
    // QWidget类的 公共成员函数
    this->setWindowIcon(Q);

    // 给窗口设置图标
    // 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
    // 发布 exe 需要额外发布图片, 将其部署到某个目录中
    //setWindowIcon(QIcon("d:\\pic\\1.ico"));



    //使用API布局
    // 创建符窗口对象
    //QWidget *window1 = new QWidget();

    // 创建若干个子窗口对象
    QPushButton *button1 = new QPushButton("One");
    QPushButton *button2 = new QPushButton("Two");
    QPushButton *button3 = new QPushButton("Three");
    QPushButton *button4 = new QPushButton("Four");
    QPushButton *button5 = new QPushButton("Five");

    // 创建水平布局对象
    QHBoxLayout *layout1 = new QHBoxLayout;
    // 将子窗口添加到布局中
    layout1->addWidget(button1);
    layout1->addWidget(button2);
    layout1->addWidget(button3);
    layout1->addWidget(button4);
    layout1->addWidget(button5);

    // 将水平布局设置给父窗口对象
    this->ui->widget_3->setLayout(layout1);
    // 显示父窗口
    this->ui->widget_3->show();


    //使用API布局
    //创建垂直布局
    // 创建符窗口对象
    //QWidget *window2 = new QWidget;
    // 创建若干个子窗口对象
    QPushButton *button21 = new QPushButton("One");
    QPushButton *button22 = new QPushButton("Two");
    QPushButton *button23 = new QPushButton("Three");
    QPushButton *button24 = new QPushButton("Four");
    QPushButton *button25 = new QPushButton("Five");

    // 创建垂直布局对象
    QVBoxLayout *layout2 = new QVBoxLayout;
    // 将子窗口添加到布局中
    layout2->addWidget(button21);
    layout2->addWidget(button22);
    layout2->addWidget(button23);
    layout2->addWidget(button24);
    layout2->addWidget(button25);

    // 将水平布局设置给父窗口对象
    this->ui->widget_4->setLayout(layout2);
    // 显示父窗口
    this->ui->widget_4->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

其中,主窗口ui文件中添加的widget为:
在这里插入图片描述
最终运行效果为:

在这里插入图片描述

使用QGridLayout完成网格布局

// 构造函数
QGridLayout::QGridLayout();
QGridLayout::QGridLayout(QWidget *parent);

// 添加窗口对象到网格布局中
/*
参数:
  - widget: 添加到布局中的窗口对象
  - row: 添加到布局中的窗口对象位于第几行 (从0开始)
  - column: 添加到布局中的窗口对象位于第几列 (从0开始)
  - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可
*/
void QGridLayout::addWidget(
	QWidget *widget, int row, int column, 
Qt::Alignment alignment = Qt::Alignment());

/*
参数:
  - widget: 添加到布局中的窗口对象
  - fromRow: 添加到布局中的窗口对象位于第几行 (从0开始)
  - fromColumn: 添加到布局中的窗口对象位于第几列 (从0开始)
  - rowSpan: 添加的窗口从 fromRow 行开始跨越的行数
  - columnSpan: 添加的窗口从 fromColumn 列开始跨越的列数
  - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可
*/
void QGridLayout::addWidget(
QWidget *widget, int fromRow, int fromColumn, 
int rowSpan, int columnSpan, 
Qt::Alignment alignment = Qt::Alignment());

// 设置 column 对应的列的最新宽度, 单位: 像素
void QGridLayout::setColumnMinimumWidth(int column, int minSize);

// 设置布局中水平方向窗口之间间隔的宽度
void QGridLayout::setHorizontalSpacing(int spacing);

// 设置布局中垂直方向窗口之间间隔的宽度
void QGridLayout::setVerticalSpacing(int spacing);

实际demo

    //使用API布局
    //创建网格布局
    // 创建父窗口对象
    QWidget* window3 = new QWidget;
    // 创建子窗口对象
    QPushButton *button31 = new QPushButton("One");
    QPushButton *button32 = new QPushButton("Two");
    QPushButton *button33 = new QPushButton("Three");
    QPushButton *button34 = new QPushButton("Four");
    QPushButton *button35 = new QPushButton("Five");
    QPushButton *button6 = new QPushButton("Six");
    // 多行文本编辑框
    QTextEdit* txedit3 = new QTextEdit;
    txedit3->setText("我占用了两行两列的空间哦。");

    QGridLayout* layout = new QGridLayout;
    // 按钮起始位置: 第1行, 第1列, 该按钮占用空间情况为1行1列
    layout->addWidget(button1, 0, 0);
    // 按钮起始位置: 第1行, 第2列, 该按钮占用空间情况为1行1列
    layout->addWidget(button2, 0, 1);
    // 按钮起始位置: 第1行, 第3列, 该按钮占用空间情况为1行1列
    layout->addWidget(button3, 0, 2);
    // 编辑框起始位置: 第2行, 第1列, 该按钮占用空间情况为2行2列
    layout->addWidget(txedit3, 1, 0, 2, 2);
    // 按钮起始位置: 第2行, 第3列, 该按钮占用空间情况为1行1列
    layout->addWidget(button4, 1, 2);
    // 按钮起始位置: 第3行, 第3列, 该按钮占用空间情况为1行1列
    layout->addWidget(button5, 2, 2);
    // 按钮起始位置: 第4行, 第1列, 该按钮占用空间情况为1行3列
    layout->addWidget(button6, 3, 0, 1, 3);

    // 网格布局设置给父窗口对象
    window3->setLayout(layout);
    // 显示父窗口
    window3->show();

在这里插入图片描述
嵌入到主窗口中:
添加控件widget_5
在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QIcon"
#include "QTextEdit"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建图标对象
    QIcon Q(":/new/prefix1/img/a.png");
    // QWidget类的 公共成员函数
    this->setWindowIcon(Q);

    // 给窗口设置图标
    // 弊端: 发布的 exe 必须要加载 d:\\pic\\1.ico 如果当前主机对应的目录中没有图片, 图标就无法被加载
    // 发布 exe 需要额外发布图片, 将其部署到某个目录中
    //setWindowIcon(QIcon("d:\\pic\\1.ico"));



    //使用API布局
    // 创建符窗口对象
    //QWidget *window1 = new QWidget();

    // 创建若干个子窗口对象
    QPushButton *button1 = new QPushButton("One");
    QPushButton *button2 = new QPushButton("Two");
    QPushButton *button3 = new QPushButton("Three");
    QPushButton *button4 = new QPushButton("Four");
    QPushButton *button5 = new QPushButton("Five");

    // 创建水平布局对象
    QHBoxLayout *layout1 = new QHBoxLayout;
    // 将子窗口添加到布局中
    layout1->addWidget(button1);
    layout1->addWidget(button2);
    layout1->addWidget(button3);
    layout1->addWidget(button4);
    layout1->addWidget(button5);

    // 将水平布局设置给父窗口对象
    this->ui->widget_3->setLayout(layout1);
    // 显示父窗口
    this->ui->widget_3->show();


    //使用API布局
    //创建垂直布局
    // 创建符窗口对象
    //QWidget *window2 = new QWidget;
    // 创建若干个子窗口对象
    QPushButton *button21 = new QPushButton("One");
    QPushButton *button22 = new QPushButton("Two");
    QPushButton *button23 = new QPushButton("Three");
    QPushButton *button24 = new QPushButton("Four");
    QPushButton *button25 = new QPushButton("Five");

    // 创建垂直布局对象
    QVBoxLayout *layout2 = new QVBoxLayout;
    // 将子窗口添加到布局中
    layout2->addWidget(button21);
    layout2->addWidget(button22);
    layout2->addWidget(button23);
    layout2->addWidget(button24);
    layout2->addWidget(button25);

    // 将水平布局设置给父窗口对象
    this->ui->widget_4->setLayout(layout2);
    // 显示父窗口
    this->ui->widget_4->show();


    //使用API布局
    //创建网格布局
    // 创建父窗口对象
    //QWidget* window3 = new QWidget;
    // 创建子窗口对象
    QPushButton *button31 = new QPushButton("One");
    QPushButton *button32 = new QPushButton("Two");
    QPushButton *button33 = new QPushButton("Three");
    QPushButton *button34 = new QPushButton("Four");
    QPushButton *button35 = new QPushButton("Five");
    QPushButton *button6 = new QPushButton("Six");
    // 多行文本编辑框
    QTextEdit* txedit3 = new QTextEdit;
    txedit3->setText("我占用了两行两列的空间哦。");

    QGridLayout* layout = new QGridLayout;
    // 按钮起始位置: 第1行, 第1列, 该按钮占用空间情况为1行1列
    layout->addWidget(button1, 0, 0);
    // 按钮起始位置: 第1行, 第2列, 该按钮占用空间情况为1行1列
    layout->addWidget(button2, 0, 1);
    // 按钮起始位置: 第1行, 第3列, 该按钮占用空间情况为1行1列
    layout->addWidget(button3, 0, 2);
    // 编辑框起始位置: 第2行, 第1列, 该按钮占用空间情况为2行2列
    layout->addWidget(txedit3, 1, 0, 2, 2);
    // 按钮起始位置: 第2行, 第3列, 该按钮占用空间情况为1行1列
    layout->addWidget(button4, 1, 2);
    // 按钮起始位置: 第3行, 第3列, 该按钮占用空间情况为1行1列
    layout->addWidget(button5, 2, 2);
    // 按钮起始位置: 第4行, 第1列, 该按钮占用空间情况为1行3列
    layout->addWidget(button6, 3, 0, 1, 3);

    // 网格布局设置给父窗口对象
    this->ui->widget_5->setLayout(layout);
    // 显示父窗口
    this->ui->widget_5->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}


效果为:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日志搞不定?手把手教你如何使用Log4j2

系列文章目录 从零开始,手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 SpringBean生成流程详解 —— 由浅入深(附超精细流程图) Spring监听器用法与原理详解 Spring事务畅谈 —— 由浅入深彻底弄懂 Transactional注解 面试热点详解…

AS中回退git历史版本并删除历史提交记录

当您想把某个版本后的代码删除,回滚到指定的版本。可以使用一下的方法。 一、打开AS中git历史提交窗口 二、选择需要回滚的版本选项,右键弹出菜单。选择Reset Current Branch to Here... 三、选择 Hard 选项 soft:将合并的更改应用到当前分支…

Linux:编写编译脚本Makefile文件

一、生成可执行文件 1、一个源文件编译 本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。 1).c文件 // testadd.c #include <stdio.h> int main() {int a 1;int b 2;int sum a b;printf("sum %d\n", sum);return 0; }// Makefie GXX g CC gcc…

计算机竞赛 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xf…

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比&#xff0c;ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…

windows安装新openssl后依然显示旧版本

1、Windows环境下升级openssl后&#xff0c;通过指令openssl version -a查看版本号&#xff1a; 这个版本号是以前的老版本&#xff0c;不知道在哪里 2、网上找了老半天也没找到答案&#xff0c;最后通过指令 where openssl 才找到原来的openssl在哪里&#xff0c;把老的卸载掉…

ASEMI快恢复二极管APT80DQ20BG封装尺寸

编辑-Z APT80DQ20BG参数描述&#xff1a; 型号&#xff1a;APT80DQ20BG 最大峰值反向电压(VRRM)&#xff1a;200V 最大直流阻断电压VR(DC)&#xff1a;200V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …

使用VisualStudio制作上位机(二)

文章目录 使用VisualStudio制作上位机(二)第三部分:GUI内部函数设计使用VisualStudio制作上位机(二) Author:YAL 第三部分:GUI内部函数设计 事件添加 给窗体或窗体按钮相关的操作添加事件有两种方式,事件的名字直白的表面了这是什么事件。 直接双击界面,自动生成窗…

SocketTools.NET 11.0.2148.1554 Crack

添加新功能以简化使用 URL 建立 TCP 连接的过程。 2023 年 8 月 23 日 - 12:35新版本 特征 添加了“HttpGetTextEx”函数&#xff0c;该函数在返回字符串缓冲区中的文本内容时提供附加选项。添加了对“FileTransfer”.NET 类和 ActiveX 控件中的“GetText”和“PutText”方法的…

python模拟登入某平台+破解验证码

概述 python模拟登录平台&#xff0c;遇见验证码识别&#xff01;用最简单的方法seleniumda破解验证码&#xff0c;来自动登录平台 详细 python用seleniumxpath模拟登录破解验证码 先随便找个小说平台用户登陆 - 书海小说网用户登陆 - 书海小说网用户登陆 - 书海小说网 准…

2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Spring Boot】详解条件注解以及条件拓展注解@Conditional与@ConditionalOnXxx

Spring Conditional Spring 4.0提供的注解。作用是给需要装载的Bean增加一个条件判断。只有满足条件才会装在到IoC容器中。而这个条件可以由自己去完成的&#xff0c;可以通过重写Condition接口重写matches()方法去实现自定义的逻辑。所以说这个注解增加了对Bean装载的灵活性。…

【肌电图信号分析】通道肌电图并查找收缩周期的数量、振幅、最大值和持续时间(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

在本地搭建Jellyfin影音服务器,支持公网远程访问影音库的方法分享

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

threejs贴图系列(一)canvas贴图

threejs不仅支持各种texture的导入生成贴图&#xff0c;还可以利用canvas绘制图片作为贴图。这就用到了CanvasTexture&#xff0c;它接受一个canas对象。只要我们绘制好canvas&#xff0c;就可以作为贴图了。这里我们利用一张图片来实现这个效果。 基础代码&#xff1a; impo…

sizeof和strlen的对比

文章目录 &#x1f6a9;前言&#x1f6a9;sizeof&#x1f6a9;strlen&#x1f6a9;sizeof和strlen对比 &#x1f6a9;前言 很多小白在学习中&#xff0c;经常将sizeof和strlen弄混了。本篇文章&#xff0c;小编讲解一下sizeof和strlen的区别。&#x1f937;‍♂️ &#x1f6a9…

分享好用的翻译软件

网易有道翻译→网易有道翻译

npm install 安装依赖,报错 Host key verification failed

设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…

css实现文字的渐变,适合大屏

1 在全局写一个全局样式&#xff0c;文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 &#xff1f;_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…

docker 安装 redis

目录 1、下载镜像文件 2、创建实例并启动 3、使用 redis 镜像执行 redis-cli 命令连接 4、redis持久化操作 5、然后按照第3点&#xff0c;再试一试&#xff0c;看看redis持久化是否配置成功。 6、最后与redis可视化工具测试连接 大家先 su root&#xff0c;这让输入命令就…