c++qt 学习笔记,与注意事项

news2024/12/23 5:23:02

目录

1 构建一个简单的应用        

1.1 创建工程

1.2 widget.h文件修改

1.3 widget.cpp文件修改

 1.4 生成可执行exe文件

2 内置部件总结

2.1 输入部件类

2.1.1 普通按钮QPushButton示例

 2.1.2 工具按钮QToolButton

 2.1.3 单选按钮QRadioButton

 2.1.4 复选按钮

 2.1.5 connect中使用lambda函数作为槽函数

 2.1.6 使用connect对按钮的勾选调试

2.1.7 行编辑框QLineEdit

2.1.8 组合框/下拉框QComboBox

2.1.9 字体选择框QFontComboBox

 2.1.10 文本编辑框QTextEdit

2.1.11 自旋框QSpinBox/QLCDNumber

 2.1.12 旋钮 QDial

2.1.13 滚动条QScrollBar

 2.1.14滑动杆QSlider

2.2 输出部件类

2.2.1 标签QLabel(图片、gif加载)

 2.2.2 文本浏览器QTextBroswer

 2.2.3 图形视图框架——日历QCalendarWidget、七段数码管QLCDNumber

 2.2.4 进度条QProgressBar

 2.2.5 定时器QTimer

 2.3 QT组合部件

2.4 容器类


1 构建一个简单的应用        

        构建一个简单的应用,需要进行如下步骤:

1.1 创建工程

        创建工程时,须注意编译形式

        qmake:出现一个.pro文件

        cmake: 出现一个cmakelist.txt文件

        上述两种编译方式均可对应修改从而使得应用添加对应的模块,实现拓展功能,如在.pro文件中对如下部分进行修改。 

        

        其次,是kit的选择,MingGW支持跨平台开发,MSVC支持visual studio IDE,且性能最佳 

        随后qt creator会自动生成下列文件:

        

1.2 widget.h文件修改

        a)根据需求,导入对应的按钮,文本编辑等头文件

#include <QWidget>
#include <QTextEdit>
#include <QPushButton>

        b)在widget类中定义需要的元素指针对象,便于在widget.cpp文件中new出实例。

class Widget : public QWidget
{
    Q_OBJECT
signals:
    void fileNamesSelected(const QStringList& fileNames);
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    //根据需求定义的元素指针对象
    QTextEdit *te_test;
    QPushButton *bt_filename;
    QPushButton *bt_getcolor;
    QPushButton *bt_getfont;
    QPushButton *bt_getinput;
    QPushButton *bt_error;
    QPushButton *bt_message;
    QPushButton *bt_progress;
};

1.3 widget.cpp文件修改

        a)include布局需要的文件或类:

#include "widget.h"

#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFileDialog>
#include <QColorDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QErrorMessage>
#include <QMessageBox>
#include <QProgressDialog>

        b)根据1.2中定义的元素指针,在函数Widget中使用new实例化:

//添加需要的元素
    bt_filename = new QPushButton("获取文件名");
    bt_getcolor = new QPushButton("获取颜色");
    bt_getfont = new QPushButton("获取字体");
    bt_getinput = new QPushButton("获取输入");
    bt_error = new QPushButton("错误弹窗");
    bt_message= new QPushButton("消息弹窗");
    bt_progress = new QPushButton("进度条对话框");

    te_test = new QTextEdit;

        c)按照需求进行布局:

        通常的过程为:

        QLayoutType *layout = new QLayoutType  //先new一个Qt布局

        layout->addSome(之前实例化的按钮等对象)  //在布局中添加新布局或元素,可用方法如下:

        

        setLayOut(layout) // 设置布局

//定义布局
    QVBoxLayout *vbox = new QVBoxLayout;

    vbox->addWidget(bt_filename);
    vbox->addWidget(bt_getcolor);
    vbox->addWidget(bt_getfont);
    vbox->addWidget(bt_getinput);
    vbox->addWidget(bt_error);
    vbox->addWidget(bt_message);
    vbox->addWidget(bt_progress);

    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addLayout(vbox);
    hbox->addWidget(te_test);
    setLayout(hbox);

        d)使用connect函数,链接元素对象、事件、槽函数:

        即当该元素对象发生了某个事件时,会激发槽函数。

        connect(元素对象,事件,槽函数)

//这里槽函数可用lambda函数形式

//文件对话框示例
    connect(bt_filename, &QPushButton::clicked, [&](){
        //提取多个文件名的对话框,通过QFileDialog的getOpenFileNames来获取文件名
        QStringList filenames = QFileDialog::getOpenFileNames(this, "打开图片", ".", "Images (*.png *.xpm *.jpg)");
        for(int i=0; i<filenames.length(); i++)
            te_test->append(filenames[i]);
    });

    //颜色对话框
    connect(bt_getcolor, &QPushButton::clicked,[&](){
        QColor color = QColorDialog::getColor();//通过QColorDialog来选择颜色
        te_test->setTextColor(color);
    });

    //字体对话框
    connect(bt_getfont, &QPushButton::clicked, [&](){
        bool ok;
        QFont font = QFontDialog::getFont(&ok);//通过QFondDialog获取字体,并用引用的形式来返回是否进行字体选择
        if(ok)
            te_test->setCurrentFont(font);
    });

    //输入对话框
    connect(bt_getinput, &QPushButton::clicked, [&](){
        QString str = QInputDialog::getText(this, "xxxx","sdsaf");
        te_test->setText(str);
    });

    //消息对话框
    connect(bt_message, &QPushButton::clicked, [&](){
        QMessageBox::warning(this, "xxxx", "esaf",
                             QMessageBox::Open,
                             QMessageBox::Apply);
    });

    //错误消息对话框
    connect(bt_error, &QPushButton::clicked, [&](){
        QErrorMessage xx;
        xx.showMessage("xxxxxxxxxxxxxx");
    });

    //进度条对话框
    connect(bt_progress, &QPushButton::clicked, [&](){
        QProgressDialog x;
        x.setValue(88);
        x.exec();
    });

        最后点击这里进行调试:

 1.4 生成可执行exe文件

        a)找到编译构建后的文件,打开Debug,将其中的exe文件复制到一个新建的空文件夹中。

         b)根据创建的QT项目kit类型,从下面两个终端中选择合适的打开:

        

        c)cd到装有exe文件的文件夹路径下:

        d)执行如下命令:

windeployqt.exe filname.exe

        注:filename为exe文件名 

         最后,就可以点击该文件夹中的.exe文件执行qt应用了。

2 内置部件总结

        a)导入在头文件中的部件:

#include <QPushButton>  //普通按钮
#include <QToolButton>  //工具栏按钮
#include <QRadioButton> //单选按钮
#include <QCheckBox>    //复选按钮
#include <QLabel>       //标签

#include <QTextBrowser>     //文本浏览器
#include <QCalendarWidget>  //日历
#include <QLCDNumber>       //七段数码管
#include <QProgressBar>     //进度条

#include <QLineEdit>        //行编辑框
#include <QComboBox>        //组合框
#include <QFontComboBox>    //字体选择下拉框
#include <QTextEdit>        //文本编辑框
#include <QSpinBox>         //自旋框
#include <QDial>            //旋钮
#include <QScrollBar>       //滚动条
#include <QSlider>          //滑动杆

        b)导入在cpp文件中的部件:

#include <QHBoxLayout>          //垂直布局
#include <QVBoxLayout>          //水平布局
#include <QGridLayout>          //网格状布局

       

注意:后续内容为节省篇幅,均已经在widget.h中定义了相关的类指针。 

2.1 输入部件类

2.1.1 普通按钮QPushButton示例

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pb = new QPushButton("ok");
    pb->setMinimumSize(200,100);        //设置最小尺寸
    pb->setFlat(true);                  //设置无边框
    pb->setIconSize(QSize(150,120));      //设置按钮图标大小
    pb->setIcon(QIcon("E:\\image_packages\\image4.jpeg"));  //设置按钮

    //添加布局
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(pb);
    setLayout(vbox);
}

 2.1.2 工具按钮QToolButton

//写在widget.cpp中的Widget、textButton定义
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    tb = new QToolButton();
    tb->setMinimumSize(200,100);        //设置最小尺寸
    //    tb->setFlat(true);                  //设置无边框
    tb->setIconSize(QSize(150,120));      //设置按钮图标大小
    tb->setIcon(QIcon("E:\\image_packages\\image4.jpeg"));  //设置按钮
    tb->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M));    //绑定快捷键

    //添加布局
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(tb);
    setLayout(vbox);

    connect(tb,SIGNAL(clicked(bool)),this,SLOT(textButton()));
}
void Widget::textButton()
{
    qDebug()<<"xxxxxxxxxx";
}

//写在widget.h中的槽函数声明
public slots:
    void textButton();

 2.1.3 单选按钮QRadioButton

        单选意思是只能从多个内容中选一个。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    radioButton1 = new QRadioButton("猫头鹰");
    radioButton2 = new QRadioButton("老虎");
    radioButton1->setIcon(QIcon("E:\\image_packages\\image4.jpeg"));
    radioButton2->setIcon(QIcon("E:\\image_packages\\image1.jpeg"));
    radioButton1->setIconSize(QSize(150,120));      //设置按钮图标大小
    radioButton2->setIconSize(QSize(150,120));      //设置按钮图标大小
    //添加布局
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(radioButton1);
    vbox->addWidget(radioButton2);
    setLayout(vbox);
}

 

 2.1.4 复选按钮

        复选意为可以从多个按钮中选一个或多个。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    checkBox1 = new QCheckBox("猫头鹰");
    checkBox2 = new QCheckBox("老虎");
    checkBox1->setIcon(QIcon("E:\\image_packages\\image4.jpeg"));
    checkBox2->setIcon(QIcon("E:\\image_packages\\image1.jpeg"));
    checkBox1->setIconSize(QSize(150,120));      //设置按钮图标大小
    checkBox2->setIconSize(QSize(150,120));      //设置按钮图标大小
    //添加布局
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(checkBox1);
    vbox->addWidget(checkBox2);
    setLayout(vbox);
}

 2.1.5 connect中使用lambda函数作为槽函数

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pb = new QPushButton("按我一下");

    checkBox1 = new QCheckBox("猫头鹰");
    checkBox2 = new QCheckBox("老虎");
    checkBox1->setIcon(QIcon("E:\\image_packages\\image4.jpeg"));
    checkBox2->setIcon(QIcon("E:\\image_packages\\image1.jpeg"));
    checkBox1->setIconSize(QSize(150,120));      //设置按钮图标大小
    checkBox2->setIconSize(QSize(150,120));      //设置按钮图标大小
    //添加布局
    QVBoxLayout *vbox = new QVBoxLayout;

    vbox->addWidget(checkBox1);
    vbox->addWidget(checkBox2);
    vbox->addWidget(pb);
    setLayout(vbox);

    connect(pb,&QPushButton::clicked, [&](){
        qDebug() << "这是一段调试输出。。。";
    });
}

 2.1.6 使用connect对按钮的勾选调试

        这里以复用按钮为例

//槽函数定义
    void debugCBox1(){
        qDebug() << "猫头鹰被勾选了!";
    }
    void debugCBox2(){
        qDebug() << "老虎被勾选了!";
    }

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pb = new QPushButton("按我一下");

    checkBox1 = new QCheckBox("猫头鹰");
    checkBox2 = new QCheckBox("老虎");
    checkBox1->setIcon(QIcon("E:\\image_packages\\image4.jpeg"));
    checkBox2->setIcon(QIcon("E:\\image_packages\\image1.jpeg"));
    checkBox1->setIconSize(QSize(150,120));      //设置按钮图标大小
    checkBox2->setIconSize(QSize(150,120));      //设置按钮图标大小
    //添加布局
    QVBoxLayout *vbox = new QVBoxLayout;

    vbox->addWidget(checkBox1);
    vbox->addWidget(checkBox2);
    vbox->addWidget(pb);
    setLayout(vbox);

    connect(pb,&QPushButton::clicked, [&](){
        qDebug() << "这是一段调试输出。。。";
    });

    connect(checkBox1,SIGNAL(clicked(bool)),SLOT(debugCBox1()));
    connect(checkBox2,SIGNAL(clicked(bool)),SLOT(debugCBox2()));
}

2.1.7 行编辑框QLineEdit

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit;
    cb = new QCheckBox("显示输入内容@@");
    le->setEchoMode(QLineEdit::Password);   //将行编辑框中的内容遮盖

    connect(cb, &QCheckBox::clicked, [&](bool x){
        le->setEchoMode(x?QLineEdit::Normal:QLineEdit::Password);
    });     //使用connect在勾选复选按钮时,显示被遮盖的行编辑框中的内容

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget((le));
    vbox->addWidget(cb);
    setLayout(vbox);
}

2.1.8 组合框/下拉框QComboBox

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    comboBox = new QComboBox;
    comboBox->addItem("选我!");
    comboBox->addItem("选我,选我!");
    comboBox->addItem("选我啊!!");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(comboBox);
    setLayout(vbox);
    
    //由于输出为QString参数,而currentIndexChange信号为int型,故采用Qcombobox的索引来间接获取输出
    connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [&](int index) {
           QString selectedItem = comboBox->itemText(index);
           qDebug() << selectedItem;
       });
}

注意:由于输出为QString参数,而currentIndexChange信号为int型,故采用Qcombobox的索引来间接获取输出

2.1.9 字体选择框QFontComboBox

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit;
    fontComboBox = new QFontComboBox;

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(fontComboBox);

    connect(fontComboBox, &QFontComboBox::currentFontChanged, [&](QFont x){
        le->setFont(x);
    });
    setLayout(vbox);
}

 2.1.10 文本编辑框QTextEdit

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit;
    txtEdit = new QTextEdit;
    fontComboBox = new QFontComboBox;

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(txtEdit);
    vbox->addWidget(fontComboBox);

    connect(fontComboBox, &QFontComboBox::currentFontChanged, [&](QFont x){
        le->setFont(x);
        txtEdit->setCurrentFont(x);
    });
    setLayout(vbox);
}

2.1.11 自旋框QSpinBox/QLCDNumber

        这里使用connect将变化的spinBox参数映射展示到QLCDNumber框中。主要就是为了跟随变化。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    spinBox = new QSpinBox;
    spinBox->setRange(20, 100);//设置上下限

    lcd = new QLCDNumber;
    lcd->setMinimumHeight(50);//设置最小高度

    connect(spinBox, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));//链接spinbox和lcd

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lcd);
    vbox->addWidget(spinBox);

    setLayout(vbox);
}

 2.1.12 旋钮 QDial

        在2.11的基础上加了旋钮的,并将其与QLCDNumber显示进行连接。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    spinBox = new QSpinBox;
    spinBox->setRange(20, 100);//设置上下限

    lcd = new QLCDNumber;
    lcd->setMinimumHeight(50);//设置最小高度

    dial = new QDial; //旋钮实例化
    connect(dial, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    connect(spinBox, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));//链接spinbox和lcd

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lcd);
    vbox->addWidget(spinBox);
    vbox->addWidget(dial);

    setLayout(vbox);
}

2.1.13 滚动条QScrollBar

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lcd = new QLCDNumber;
    lcd->setMinimumHeight(50);//设置最小高度

    spinBox = new QSpinBox;
    spinBox->setRange(20, 100);//设置上下限
    connect(spinBox, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));//链接spinbox和lcd

    dial = new QDial; //旋钮实例化
    connect(dial, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    scrollBar = new QScrollBar;//滚动条实例化
    scrollBar->setOrientation(Qt::Horizontal);//设置滚动条长轴沿水平方向
    connect(scrollBar, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lcd);
    vbox->addWidget(spinBox);
    vbox->addWidget(dial);
    vbox->addWidget(scrollBar);

    setLayout(vbox);
}

 2.1.14滑动杆QSlider

        滑动杆与滚动条类似,此处只展示效果

 

2.2 输出部件类

2.2.1 标签QLabel(图片、gif加载)

        标签对齐、图片加载、图片缩放:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lb1 = new QLabel("我是一号标签");
    lb2 = new QLabel("我是二号标签");
    lb1->setAlignment(Qt::AlignCenter); //设置对齐方式
    lb2->setScaledContents(true);   //设置标签自动缩放加载的图片
    lb2->setPixmap(QPixmap("E:\\image_packages\\image2.jpeg"));

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lb1);
    vbox->addWidget(lb2);
    setLayout(vbox);
}

        标签,加载gif动图:

        需要先#include <QMovie> ,其对象不需要预先在widget.h中定义。

#include <QMovie>               //导入动画包
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lb_gif = new QLabel;
    lb_gif->setAlignment(Qt::AlignCenter);
    QMovie *m = new QMovie("E:\\image_packages\\gif1.gif");
    lb_gif->setMovie(m);
    m->start();

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lb_gif);
    setLayout(vbox);
}

        

 2.2.2 文本浏览器QTextBroswer

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    txtBrowser = new QTextBrowser;
    txtBrowser->setHtml("</head>\
                        <body>\
                        <div class=\"wrapper\">\
                        <div class=\"tophead\">\
                            <div class=\"left\">\
                                <h1 class=\"logo\"><a href=\"http://www.laoqishu.com\">奇书网</a></h1>\
                            </div>\
                            <div class=\"fright\" id=\"loginbox\"><script type=text/javascript>login();</script></div>\
                        </div>");

    lb1 = new QLabel("一号标签");
    lb1->setScaledContents(true);
    lb1->setPixmap(QPixmap("E:\\image_packages\\image1.jpeg"));
    lb1->setFixedSize(200,120); //为标签设置固定尺寸

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(txtBrowser);
    vbox->addWidget(lb1);
    setLayout(vbox);
}

 PS:这里我是随便找到个网站的源码复制了一部分,修改部分“”,并添加了换行符

 2.2.3 图形视图框架——日历QCalendarWidget、七段数码管QLCDNumber

        日历:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lb1 = new QLabel("一号标签");
    lb1->setScaledContents(true);
    lb1->setPixmap(QPixmap("E:\\image_packages\\image1.jpeg"));
    lb1->setFixedSize(200,120); //为标签设置固定尺寸

    calender = new QCalendarWidget;//实例化日历
    connect(calender, &QCalendarWidget::clicked, [&](QDate x){
        qDebug() << x;
    });//连接日历点击事件,qdebug输出
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(calender);
    vbox->addWidget(lb1);
    setLayout(vbox);
}

        七段数码管QLCDNumber:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lb1 = new QLabel("一号标签");
    lb1->setScaledContents(true);
    lb1->setPixmap(QPixmap("E:\\image_packages\\image1.jpeg"));
    lb1->setFixedSize(200,120); //为标签设置固定尺寸

    calender = new QCalendarWidget;//实例化日历

    lcd = new QLCDNumber;
    lcd->setDigitCount(30); //范围设置
    lcd->setMinimumSize(400,100);//大小设置
    lcd->display(234);

    connect(calender, &QCalendarWidget::clicked, [&](QDate x){
        qDebug() << x;
        lcd->display(x.toString());//输出日期在七段数码管上
    });//连接日历点击事件,qdebug输出

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(calender);
    vbox->addWidget(lb1);
    vbox->addWidget(lcd);
    setLayout(vbox);
}

 

 2.2.4 进度条QProgressBar

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pBar = new QProgressBar;
    pBar->setValue(99);

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(pBar);
    setLayout(vbox);
}

 2.2.5 定时器QTimer

#include <QTimer>               //导入QTimer定时器
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pBar = new QProgressBar;
    pBar->setValue(0);

    QTimer *timer1 = new QTimer; //new一个定时器类
    connect(timer1, &QTimer::timeout, [&](){
        static int x = 0;
        pBar->setValue(x++);
    });
    timer1->start(100);
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(pBar);
    setLayout(vbox);
}

这里进度条随着定时器的内置数值在变化。

 2.3 QT组合部件

        QColorDialog, QErrorMessage, QFileDialog, QFontDialog, QInputDialog, QMessageBox, QProgressDialog, and QWizard。

2.4 容器类

        

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

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

相关文章

Unity - Stencil Test 开关,无法通过脚本或是 shader lab 开关来控制

查看过 shader lab 文档: ShaderLab command: Stencil&#xff0c;没有看到 stencil test 关闭的功能&#xff0c;我真的无语。。。 只能开&#xff0c;不能关&#xff0c;意思一个 shader lab 一旦编写了 stencil { } 的内容&#xff0c;就必须开启。。。 好 low 的设计 在网…

【C语言】深剖数据在内存中的存储

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明 零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP&#xff0c;它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤&#xff08;承诺、挑战和证明&#xff09;&#xff0c;在文献中通常被称…

传奇新手小白架设单机给玩家充值元宝教程

阿杰今天和大家说说架设的单机如何给玩家和给自已充值元宝的教程 相信有很多玩家都架设过单机吧&#xff0c;架设容易&#xff0c;但是还有一些搞不明白&#xff0c;就是版本里面需 要充值点和积分回馈点才能领取的&#xff0c;那么这些怎么设置呢&#xff1f;今天就教大家两种…

【Express.js】evp-express-cli

evp-express-cli evp-express-cli 是笔者结合自己的实践经验编写的一款 express 手脚架&#xff0c;以一种比较合适的流程构建的 express 架构。 文档 安装用法 命令新建项目运行模板 验证数据库RedisAuthRabbitMQSocketIONacos 开发工具 BabelEsintJestPkgPM2 资源配置日志异…

【Docker】详解docker安装及使用

详解docker安装及使用 1. 安装docker2. Docker镜像操作3. Docker容器操作4.知识点总结4.1 docker镜像操作4.2 docker容器操作4.3 docker run启动过程 参见docker基础知识点详解 1. 安装docker 目前 Docker 只能支持 64 位系统。 systemctl stop firewalld.service setenforce…

Docker 应用容器引擎 (一)

Docker 应用容器引擎 Docker是什么 是一个开源的应用容器引擎&#xff0c;基于GO语言开发并遵循了apache2.0协议开源 是在linux容器里运行应用的开源工具 是一种轻量级的“虚拟机” Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的…

NOTA WL12,新型双功能整合剂,正电子发射断层扫描 (PET) 显像剂

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ NOTA-WL12试剂 | 基础知识概述&#xff08;部分&#xff09; 英文名称&#xff1a;NOTA-WL12 CAS号&#xff1a;N/A 分子式&#xff1a;N/A 分子量&#xff1a;N/A 规格标准…

【Linux】Docker 基本管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Docker 基本管理 Docker 概述Docker 核心概念Docker 安装部署Docker 镜像操作Docker 容器操作 Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵…

如何在Windows 10中启用或禁用缩略图预览

文件资源管理器可以在 Windows 10 中显示文件和文件夹的缩略图或图标。 本教程将向你展示如何在文件资源管理器中为你的帐户、所有用户或Windows 10 中的特定用户启用或禁用缩略图预览。 缩略图预览仅在打开并且选择了中等图标、大图标或超大图标文件夹视图布局时显示。 如果缩…

【T1】T1飞跃版红字反冲,提示单据已生成了凭证,不能红冲。但是联查凭证不存在。

【问题描述】 T1飞跃专业版&#xff0c;在经营历程中操作【红字反冲】的时候&#xff0c; 提示&#xff1a;单据已生成了凭证&#xff0c;不能红冲。 但是选中单据&#xff0c;点击联查凭证的时候&#xff0c;又提示【单据没有凭证】。 【解决方法】 针对账套库执行下述语句&…

若依vue -【 33 ~ 】

33 登录日志 系统管理 > 日志管理 > 登录日志 1 应用场景 统计用户的活跃度用户错误输入密码多少次 2 后台实现 &#xff08;1&#xff09;SysLoginController#login&#xff1a;登录 /*** 登录方法* * param loginBody 登录信息* return 结果*/PostMapping("…

(七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

发布者确认&#xff08;Publisher Confirms&#xff09; 发布者确认是一个 RabbitMQ 扩展&#xff0c;用于实现可靠的发布。当在通道上启用发布者确认时&#xff0c;客户端发布的消息将由代理异步确认&#xff0c;这意味着它们已在服务器端得到处理。 0、引言 先决条件 本教程…

Spring、SpringBoot、SpringCloud、SpringCloud Alibaba、Elasticsearch版本对应,附下载地址

1、GitHub Alibaba 发布SpringCloud Alibaba和SpringCloud 、SpringBoot版本 Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot2022.0.0.0-RC2Spring Cloud 2022.0.03.02022.0.0.0-RC1Spring Cloud 2022.0.03.0.02021.0.5.0*Spring Cloud 2021.0.52.6.132021.0.4…

Linux查看某进程所部署的目录路径

1.首先查看系统中正在跑的进程都有什么 ps -ef 2.然后通过抓取你要看的进程名&#xff0c;比如哪些服务 ps -ef | grep xxxxx(服务名) Linux在启动一个进程时&#xff0c;系统会在 /proc 下创建一个以PID命名的文件夹&#xff1b; 在该文件夹下会有我们的进程的信息&#…

【蓝图】p28按键+鼠标点击实现开关门

p28&#xff0c;创建门的蓝图类 actor和组件的区别、门的轴心点修改 创建一个Actor 添加一个静态网格体组件 创建一个门框 同理创建一个门Door 注意&#xff08;当门的中心点不在边角上时&#xff09; 创建一个Scene组件 把物体变换位置 这时只需要旋转Scene就可以旋转…

开发者评价:Serverless 容器最值得推荐的能力是什么?

Kubernetes 作为云原生计算的基础项目&#xff0c;已经在开发者和企业中获得广泛支持。它可以帮助企业加快部署频率、提升应用弹性、优化资源利用率、改善系统可用性。然而其自身复杂性和陡峭的学习曲线依然让一些开发者望而生畏&#xff1b;与此同时&#xff0c;随着企业数字化…

RabbitMQ到底为什么要使用它?

导入 一个技术的衍生必然是为了解决现实出现的问题&#xff0c;在讲这个问题之前我们先了解一下传统开发中关于服务调用出现的问题&#xff08;痛点&#xff09;有哪些&#xff1f; 我们为什么要使用MQ&#xff1f; ①、同步——超时 在多服务体系架构中&#xff0c;必然存在…

掘金量化—Python SDK文档—5.API 介绍(2)

Python SDK文档 5.API介绍 5.6通用数据函数&#xff08;免费&#xff09; python 通用数据 API 包含在 gm3.0.148 版本及以上版本&#xff0c;不需要引入新库 get_symbol_infos - 查询标的基本信息 获取指定(范围)交易标的基本信息&#xff0c;与时间无关. 此函数为掘金公…

C# 动态字典(可以随机实时增删访问,保证先入先出的字典)

如果你有以下需求&#xff1a; 1. 需要对Dictionary进行遍历的同时移除或者添加元素 2. 需要按顺序遍历Dictionary并且保证先入先出 3. 需要即时的获取字典内的元素数量&#xff0c;即时增删 如果你觉得好&#xff0c;请给我的框架点一个免费的star&#xff0c;球球啦 Yueh0607…