Qt 窗口常用位置API函数 绘图原理 双缓冲机制 总结

news2025/1/15 13:54:07

一、Qt 窗口API函数基础知识

在Qt窗口编程中,常用的API函数有:

  1. QWidget类的API函数:包括setWindowTitle()、resize()、move()、show()、hide()、setFixedSize()、setWindowFlags()等。

  2. QMainWindow类的API函数:包括setCentralWidget()、menuBar()、statusBar()、addToolBar()、setWindowTitle()等。

  3. QDialog类的API函数:包括setModal()、exec()、rejected()、accepted()等。

  4. QMessageBox类的API函数:包括information()、question()、warning()、critical()等。

  5. QFileDialog类的API函数:包括getOpenFileName()、getSaveFileName()、getExistingDirectory()等。

  6. QInputDialog类的API函数:包括getText()、getInt()、getItem()等。

  7. QDesktopWidget类的API函数:包括screen()、screenGeometry()、availableGeometry()等。

  8. QPalette类的API函数:包括setColor()、setBrush()、setPixmap()等。

  9. QPainter类的API函数:包括drawText()、drawPixmap()、drawLine()、drawRect()等。

  10. QGraphicsScene类的API函数:包括addLine()、addEllipse()、addRect()、addPixmap()等。

案例分析:实现下图功能

代码示例:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

#include <QLabel>
#include <QGridLayout>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();


private:
    QGridLayout *glayout;  // 布局

    QLabel *labelgeometry; // 显示函数名称
    QLabel *labelgeometryvalue; // 显示geometry函数获取值

    QLabel *labelwidth;
    QLabel *labelwidthvalue;
    QLabel *labelheight;
    QLabel *labelheightvalue;

    QLabel *labelrect;
    QLabel *labelrectvalue;

    QLabel *labelsize;
    QLabel *labelsizevalue;

    // 窗口大小变化事件,通过此函数获取实时窗口的大小
    void resizeEvent(QResizeEvent *);

    // 窗口移动事件,通过此函数获取实时窗口的位置
    void moveEvent(QMoveEvent *);

public:
    // 更新Label标签的值
    void UpdateLabelFunc();


};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    resize(300,150);
    setWindowTitle("Qt窗口常用的API位置函数测试");

    // 布局
    glayout=new QGridLayout(this);

    labelgeometry=new QLabel("函数geomery():");
    labelgeometryvalue=new QLabel;

    labelwidth=new QLabel("函数width():");
    labelwidthvalue=new QLabel;
    labelheight=new QLabel("函数height():");
    labelheightvalue=new QLabel;

    labelrect=new QLabel("函数rect():");
    labelrectvalue=new QLabel;

    labelsize=new QLabel("函数size():");
    labelsizevalue=new QLabel;


    glayout->addWidget(labelgeometry,0,0);
    glayout->addWidget(labelgeometryvalue,0,1);

    glayout->addWidget(labelwidth,1,0);
    glayout->addWidget(labelwidthvalue,1,1);
    glayout->addWidget(labelheight,2,0);
    glayout->addWidget(labelheightvalue,2,1);

    glayout->addWidget(labelrect,3,0);
    glayout->addWidget(labelrectvalue,3,1);

    glayout->addWidget(labelsize,4,0);
    glayout->addWidget(labelsizevalue,4,1);

    UpdateLabelFunc(); // 调用更新Label标签的值
}

Dialog::~Dialog()
{
}


// 更新Label标签的值
void Dialog::UpdateLabelFunc()
{
    QString strgeometry; // 专门存放geometry()函数的显示结果
    QString str1,str2,str3,str4;

    strgeometry=str1.setNum(geometry().x())+","+str2.setNum(geometry().y())+","+
                            str3.setNum(geometry().width())+","+str4.setNum(geometry().height());
    labelgeometryvalue->setText(strgeometry); //将获取的值展示到这个控件

    QString strw,strh;
    labelwidthvalue->setText(strw.setNum(width()));
    labelheightvalue->setText(strh.setNum(height()));

    QString strrect;
    QString strrect1,strrect2,strrect3,strrect4;
    strrect=strrect1.setNum(rect().x())+","+strrect2.setNum(rect().y())+","+
            strrect3.setNum(width())+","+strrect4.setNum(height());
    labelrectvalue->setText(strrect);

    QString strsize;
    QString strsize1,strsize2;
    strsize=strsize1.setNum(size().width())+","+strsize2.setNum(size().height());
    labelsizevalue->setText(strsize);

}

// 窗口大小变化事件,通过此函数获取实时窗口的大小
void Dialog::resizeEvent(QResizeEvent *)
{
    UpdateLabelFunc();
}

// 窗口移动事件,通过此函数获取实时窗口的位置
void Dialog::moveEvent(QMoveEvent *)
{
    UpdateLabelFunc();
}

main.cpp

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

二、Qt 绘图框架设计 (QPainter 绘制)

QPainter 是 Qt 框架中用于绘制图形元素的一个类。它提供了一组方法,可以在 QWidget 和 QImage 等 QPaintDevice 上绘制图形。QPainter 中的绘图指令包含绘制图形基础元素如点、线、矩形、圆弧,以及填充、描边和变换等操作。

使用 QPainter 前需要先创建一个 QPainter 对象,并指定要绘制的 QPaintDevice。然后,通过对 QPainter 对象调用不同的绘图方法实现所需绘图效果。

QPainter 除了提供基本的绘图操作外,还提供了一些高级的绘图操作,例如抗锯齿、渐变填充、绘制图片、文字、路径和定制化的绘制元素等。这些高级操作可以通过 QPainter 的不同成员函数进行调用。

QPainter 也是 Qt 绘图工具的一个基础,它被广泛应用于 Qt 图形用户界面(GUI)开发中,用于绘制自定义的控件、图表和各种特定的图形效果等。

案例分析:实现下图功能

代码示例:增加一个PainterArea类

painterarea.h

#ifndef PAINTERAREA_H
#define PAINTERAREA_H

#include <QWidget>

// QPen 钢笔(画笔)是基本的图形对象,绘制直线、曲线、多边形等形状
#include <QPen>

// QBrush 画刷是基本的图形对象,主要用于填充,比如矩形、多边形等形状
#include <QBrush>

#include <QPainter>

class PainterArea : public QWidget
{
    Q_OBJECT
public:
    explicit PainterArea(QWidget *parent = nullptr);

    // 绘制直线、长方形(矩形)
    enum shape{Line,Rectangle};

    void setShape(shape);  // 此函数实现绘制形状
    void setPen(QPen);
    void setBrush(QBrush);

    void paintEvent(QPaintEvent *); // 重绘事件
    void setfillrule(Qt::FillRule); // 填充规则

signals:

public slots:
private:
    shape shp;
    QPen pen;
    QBrush brsh;
    Qt::FillRule fillrle;

};

#endif // PAINTERAREA_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include "painterarea.h"
#include <QLabel>
#include <QComboBox>
#include <QGridLayout>

#include <QColorDialog>


class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private:
    PainterArea *labelshapeArea;

    QLabel *labelshape;
    QComboBox *comboboxshape;

    QGridLayout *glayout;

private slots:
    void dispShapeFunc(int);

};
#endif // WIDGET_H

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

painterarea.cpp

#include "painterarea.h"

PainterArea::PainterArea(QWidget *parent) : QWidget(parent)
{
    setPalette(QPalette(Qt::red)); // 调色板来改变背景颜色

    setAutoFillBackground(true); // Qt窗口是否需要绘制背景

    // 设置最小尺寸
    setMinimumSize(410,410);

}

void PainterArea::setShape(shape sh)  // 此函数实现绘制形状
{
    shp=sh;
    update();

}

void PainterArea::setPen(QPen sh)
{
    pen=sh;
    update();
}

void PainterArea::setBrush(QBrush sh)
{
    brsh=sh;
    update();

}

void PainterArea::paintEvent(QPaintEvent *) // 重绘事件
{
    QPainter p(this);
    p.setPen(pen);
    p.setBrush(brsh);

    QRect rect(55,110,290,180);

    switch (shp) {
    case Line: // 直线
        p.drawLine(rect.topLeft(),rect.bottomRight());
        break;
    case Rectangle: // 矩形
        p.drawRect(rect);
        break;
    default:
        break;
    }
}

void PainterArea::setfillrule(Qt::FillRule rle) // 填充规则
{
    fillrle=rle;
    update(); // 重新绘制区域窗体

}

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    labelshapeArea=new PainterArea;

    glayout=new QGridLayout; // 控制面板的布局

    setWindowTitle("Qt绘图框架测试:QPainter类");

    labelshape=new QLabel("绘制形状:"); //右边有一个下拉列表框
    comboboxshape=new QComboBox;
    comboboxshape->addItem("Line",PainterArea::Line);
    comboboxshape->addItem("Rectangle",PainterArea::Rectangle);

    connect(comboboxshape,SIGNAL(activated(int)),this,SLOT(dispShapeFunc(int)));

    glayout->addWidget(labelshape,0,0);
    glayout->addWidget(comboboxshape,0,1);

    QHBoxLayout *mainlayout=new QHBoxLayout(this); // 整体布局
    mainlayout->addWidget(labelshapeArea); // 向布局添加控件
    mainlayout->addLayout(glayout); // 向整体布局添加布局

    // 如下语句大家自己添加
    dispShapeFunc(comboboxshape->currentIndex());//显示默认的图形
}

Widget::~Widget()
{

}


void Widget::dispShapeFunc(int v)
{
    PainterArea::shape sp=PainterArea::shape(comboboxshape->itemData(v,Qt::UserRole).toInt());
    labelshapeArea->setShape(sp);
}

三、Qt 双缓冲机制

Qt双缓冲机制是一种优化技术,用于减少图形闪烁和提高图形性能,特别是在需要频繁重绘的情况下。

简单来说,双缓冲机制就是在一个缓冲区中进行图形绘制,然后将绘制好的图形复制到屏幕中显示,这样能够有效地减少图形闪烁的问题,并且提高了绘图的速度和效率。

在Qt中,双缓冲机制可以通过使用QPixmap或QImage来实现。具体的实现过程可以分为以下几个步骤:

  1. 创建一个QPixmap或QImage对象。
  2. 在该对象上进行绘图操作。
  3. 将绘制好的图像复制到屏幕中显示。

案例分析:绘图工具,可以选择线型、线宽及颜色等基本要素。QMainWindow 对象作为主窗口,QToolBar 对象作为工具栏,QWidget 对象作为主窗口的中央窗体 CentralWidget,也就是绘图区,如下图所示:

代码示例:增加一个DrawWidget类

drawwidget.h

#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H

#include <QWidget>

#include <QtGui>
#include <QMouseEvent> // 鼠标事件
#include <QPaintEvent> // 绘制事件
#include <QResizeEvent> // 实时获取窗口操作等大小
#include <QColor>
#include <QPixmap> // 显示图像
#include <QPainter>
#include <QPalette>
#include <QPen>

class DrawWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DrawWidget(QWidget *parent = nullptr);

    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    void paintEvent(QPaintEvent *);
    void resizeEvent(QResizeEvent *);

signals:

public slots:
    void setStyle(int); // 设置线风格
    void setWidth(int); // 设置线宽度
    void setColor(QColor); // 设置线颜色
    void clearFunc(); // 清除函数

private:
    QPixmap *pix; // 在屏幕上显示图像而设计和优化
    QPoint startpos;
    QPoint endPos;
    int style,widthss;
    QColor color;
    
};

#endif // DRAWWIDGET_H

mainwindow.h        

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QLabel>
#include <QComboBox>
#include <QToolButton>
#include <QSpinBox>

#include "drawwidget.h"

#include <QGridLayout>
#include <QColorDialog>
#include <QToolBar>


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


    void CreateToolBarFunc(); // 创建工具条

private:
    DrawWidget *drawWidget;

    QGridLayout *glayout;

    QLabel *labelstyle;
    QComboBox *comboboxlabelstyle;

    QLabel *labelwidth;
    QSpinBox *spinboxlabelwidth;

    QToolButton *colorbutton;
    QToolButton *clearbutton;


private slots:
    void dispstyle();
    void dispcolor();
};
#endif // MAINWINDOW_H

drawwidget.cpp

#include "drawwidget.h"

DrawWidget::DrawWidget(QWidget *parent) : QWidget(parent)
{
    setAutoFillBackground(true);
    setPalette(QPalette(Qt::white));
    pix=new QPixmap(size());
    pix->fill(Qt::white);

    // 设置绘制区窗口最小尺寸
    setMinimumSize(600,400);

}

void DrawWidget::setStyle(int s) // 设置线风格
{
    style=s;

}

void DrawWidget::setWidth(int w) // 设置线宽度
{
    widthss=w;

}

void DrawWidget::setColor(QColor c) // 设置线颜色
{
    color=c;

}

void DrawWidget::clearFunc() // 清除函数
{
    QPixmap *cPix=new QPixmap(size());
    cPix->fill(Qt::white);
    pix=cPix;
    update();
}

void DrawWidget::mousePressEvent(QMouseEvent *e)
{
    startpos=e->pos();

}

void DrawWidget::mouseMoveEvent(QMouseEvent *e)
{
    QPainter *painter=new QPainter;
    QPen pen;
    pen.setStyle((Qt::PenStyle)style);
    pen.setWidth(widthss);
    pen.setColor(color);

    painter->begin(pix);
    painter->setPen(pen);
    painter->drawLine(startpos,e->pos());
    painter->end();

    startpos=e->pos();
    update();

}

void DrawWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    painter.drawPixmap(QPoint(0,0),*pix);

}

void DrawWidget::resizeEvent(QResizeEvent *event)
{
    if(height()>pix->height() || width()>pix->width())
    {
        QPixmap *newPix=new QPixmap(size());
        newPix->fill(Qt::white);

        QPainter ps(newPix);

        ps.drawPixmap(QPoint(0,0),*pix);
        pix=newPix;
    }

    QWidget::resizeEvent(event);

}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("图形绘制综合案例分析(双缓冲机制)");
    drawWidget=new DrawWidget;
    setCentralWidget(drawWidget); // 将刚才创建对象作为主窗口的中心窗口

    CreateToolBarFunc(); // 调用此函数实现创建工具栏

    setMinimumSize(600,400);

    dispstyle();

    drawWidget->setWidth(spinboxlabelwidth->value()); // 初始化线宽度
    drawWidget->setColor(Qt::black); // 初始化线颜色

}

MainWindow::~MainWindow()
{
}


void MainWindow::CreateToolBarFunc() // 创建工具条
{
    QToolBar *toolBar=addToolBar("Tool");
    labelstyle=new QLabel("线型风格:");
    comboboxlabelstyle=new QComboBox;
    comboboxlabelstyle->addItem("SolidLine",static_cast<int>(Qt::SolidLine)); // 实线
    comboboxlabelstyle->addItem("DashLine",static_cast<int>(Qt::DashLine)); //
    comboboxlabelstyle->addItem("DashDotDotLine",static_cast<int>(Qt::DashDotDotLine));
    comboboxlabelstyle->addItem("DotLine",static_cast<int>(Qt::DotLine)); // 虚线

    // 为什么不出现虚线?activeated改为activated
    connect(comboboxlabelstyle,SIGNAL(activated(int)),this,SLOT(dispstyle()));

    labelwidth=new QLabel("线型宽度:");
    spinboxlabelwidth=new QSpinBox;
    connect(spinboxlabelwidth,SIGNAL(valueChanged(int)),drawWidget,SLOT(setWidth(int)));

    colorbutton=new QToolButton;
    QPixmap pixmap(20,20);
    pixmap.fill(Qt::black);
    colorbutton->setIcon(QIcon(pixmap));
    connect(colorbutton,SIGNAL(clicked()),this,SLOT(dispcolor()));

    clearbutton=new QToolButton;
    clearbutton->setText("清除绘制");
    connect(clearbutton,SIGNAL(clicked()),drawWidget,SLOT(clearFunc()));

    toolBar->addWidget(labelstyle);
    toolBar->addWidget(comboboxlabelstyle);
    toolBar->addWidget(labelwidth);
    toolBar->addWidget(spinboxlabelwidth);
    toolBar->addWidget(colorbutton);
    toolBar->addWidget(clearbutton);
}


void MainWindow::dispstyle()
{
    drawWidget->setStyle(comboboxlabelstyle->itemData(comboboxlabelstyle->currentIndex(),
                                                      Qt::UserRole).toInt());
}


void MainWindow::dispcolor()
{
    QColor color=QColorDialog::getColor(static_cast<int>(Qt::black),this);
    if(color.isValid())
    {
        drawWidget->setColor(color);
        QPixmap ps(20,20);
        ps.fill(color);
    }
}

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

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

相关文章

竞赛选题 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

IDEA使用http client无法识别http-client.env.json的环境配置

http-client.env.json的配置 {"dev": {"baseUrl": "http://192.168.60.176:9160","accessToken": "eyJhbPNOQ"} }选择不到环境 问题原因&#xff1a; 安装了Alibaba Cloud Toolkit插件后&#xff0c;被Alibaba Cloud ROS …

vue3中使用百度地图

基本使用 在项目的index.html加入以下代码(记得替换成自己的key) <script type"text/javascript" src"https://api.map.baidu.com/api?v1.0&typewebgl&ak自己的key"></script>在组件中加入以下代码 <template><div id&qu…

CAN通信

通讯方式 UART&#xff1a;(Universal Asynchronous Receiver Transmitter&#xff1a;通用异步收发器/异步串行通信口)&#xff0c;是一种通用的串行数据总线&#xff0c;用于异步通信&#xff0c;支持全双工。它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线…

中文连续视觉语音识别挑战赛

视觉语音识别&#xff0c;也称唇语识别&#xff0c;是一项通过口唇动作来推断发音内容的技术。该技术在公共安全、助老助残、视频验真等领域具有重要应用。当前&#xff0c;唇语识别的研究方兴未艾&#xff0c;虽然在独立词、短语等识别上取得了长足进展&#xff0c;但在大词表…

FCKeditor编辑器漏洞

FCKeditor在网页上属于开发源代码的文字编辑器&#xff0c;FCK是作者的名字 搭建环境 查看版本http://192.168.246.20:89/_whatsnew.html 编辑器界面http://192.168.246.20:89/_samples/default.html 常用上传地址 FCKeditor/editor/filemanager/browser/default/browser.html…

华为云HECS服务器下docker可视化(portainer)

一、docker安装 华为云HECS安装docker-CSDN博客 二、portainer安装 portainer地址&#xff1a;Portainer: Docker and Kubernetes Management Platform 当前portainer分CE&#xff08;开源版&#xff09; 和 BE&#xff08;商业版&#xff09;&#xff0c;用CE即可 1 创建…

聚观早报 | 真我GT5 Pro即将登场;OPPO Find N3即将亮相

【聚观365】10月18日消息 真我GT5 Pro即将登场 OPPO Find N3即将亮相 小米澎湃OS正式版已完成封包 百川智能获3亿美元A1轮融资 理想MEGA实车曝光 真我GT5 Pro即将登场 8月28日&#xff0c;全新的真我GT5正式亮相&#xff0c;该机拥有安卓阵营最强悍的性能配置&#xff0c…

kali使用docker安装DVWA

上一篇文章我记录了如何使用kali安装DVWA&#xff0c;但是我是一个一个组件安装的&#xff0c;非常麻烦&#xff0c;比如数据库还需要配置&#xff0c;花费时间很多。昨天在逛github时&#xff0c;发现大佬的靶场都是通过docker打包好的&#xff0c;如果我也用docker安装DVWA&a…

[部署网站02]下载安装 unix PHP7.4 Swoole Loader扩展文件

1.下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/13FA0lu_9uu6yhpHHA0P2yA?pwdhft7 提取码&#xff1a;hft7 2 、安装Swoole Loader 将刚才下载的Swoole Loader扩展文件&#xff08;swoole_loader74.so&#xff09;上传到当前PHP的扩展安装目录中&#x…

DAQ进行准确的测量,为决策提供更可靠的依据

进行准确的测量&#xff0c;为决策提供更可靠的依据 DAQExpress提供了交互式分析面板&#xff0c;可帮助您轻松配置兼容的测量硬件&#xff0c;以及查看分析测量数据。无需编程即可立即捕获测量数据&#xff0c;或者在DAQExpress编辑器中创建一个基本的LabVIEW VI&#xff0c;…

BERT变体(1):ALBERT、RoBERTa、ELECTRA、SpanBERT

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 *天下之大&#xff0c;虽离家万里&#xff0c;何处不可往&#xff01;何事不可为&#xff01; 1. ALBERT \qquad ALBERT的英文全称为A Lite versi…

【Leetcode】【简单】136.只出现一次的数字

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/single-number/description/ 给…

【AIFEM案例操作】水轮机转轮强度和模态分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

矩阵置零(C++解法)

题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入…

Spring AMQP

大家好我是苏麟 今天说一说spring aqmp。 SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起 来非常方便。 官方 : Spring AMQP 依赖 <!--AMQP 包含RabbitMQ--><dependency><groupId&g…

三款经典的轮式/轮足机器人讲解,以及学习EG2133产生A/B/C驱动电机。个人机器人学习和开发路线(推荐)

1&#xff0c;灯哥开源&#xff08;有使用指南&#xff0c;适合刚入门新手&#xff09; 机械部分&#xff1a;2个foc无刷电机 硬件和软件部分&#xff1a;没有驱动板子。只有驱动器&#xff0c;主控板esp32和驱动器通过pwm直接通讯。驱动器板子上有蓝色电机接口&#xff0c;直…

常见的 NoSQL 数据库有哪些?

前言 今天我们来介绍一下工作开发中常见的一些NoSQL数据库及其基本特点。欢迎在评论区留下文章中没有介绍且好用的NOSQL数据库&#x1f91e;。 什么是&#xff08;NOSQL&#xff09;非关系型数据库 非关系型数据库又被称为 NoSQL&#xff08;Not Only SQL )&#xff0c;意为不…

第八章动态规划+第九章同余【算法zxd】

算法设计过程&#xff1a; ①问题分析 ②算法策略 / 建立计算模型 ③算法设计与描述 ④算法分析 [ 算法选择 ] ⑤算法实现 ⑥测试与结果分析 ⑦文档编制 常用结论&#xff1a; 对数低于多项式&#xff1b;多项式低于指数 常用公式&#xff1a; 定理2.5 第八章&#xff1…

软件工程与计算总结(十九)软件测试

目录 ​编辑 一.引言 1.验证与确认 2.目标 3.测试用例 4.桩与驱动 5.缺陷、错误与失败 二.测试层次 1.测试层次的划分 2.单元测试 3.集成测试 4.系统测试 三.测试技术 1.测试用例的选择 2.随机测试 3.基于规格的技术&#xff08;黑盒测试&#xff09; 4.基于代…