• 2023/9/19 -- C++/QT


    作业

    1> 登录框实现注册功能,将注册的结果放入文件中(君子作业)

    2> 完成文本编辑器的保存工作

    1. void Widget::on_saveBtn_clicked()
    2. {
    3. QString fileName = QFileDialog::getSaveFileName(this,"另存为","./","*.txt");
    4. if(fileName.isNull()){
    5. QMessageBox::information(this,"提示","用户取消了另存文件");
    6. return;
    7. }
    8. QFile file(fileName);
    9. if(!file.isOpen()){
    10. if(!file.open(QIODevice::WriteOnly)){
    11. QMessageBox::critical(this,"错误","打开失败");
    12. return;
    13. }
    14. }
    15. QString text = ui->textEdit->toPlainText();
    16. file.write(text.toUtf8());
    17. file.close();
    18. }

    3>

     widget.h:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. QT_BEGIN_NAMESPACE
    10. namespace Ui { class Widget; }
    11. QT_END_NAMESPACE
    12. class Widget : public QWidget
    13. {
    14. Q_OBJECT
    15. void timerEvent(QTimerEvent *e)override;
    16. public:
    17. Widget(QWidget *parent = nullptr);
    18. ~Widget();
    19. private slots:
    20. void on_startBtn_clicked();
    21. void on_stopBtn_clicked();
    22. private:
    23. Ui::Widget *ui;
    24. int time_id1;
    25. int time_id2;
    26. QTextToSpeech *speecher;
    27. };
    28. #endif // WIDGET_H

     widget.cpp:

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. void Widget::timerEvent(QTimerEvent *e)
    4. {
    5. if(e->timerId() == time_id1){
    6. QTime sys_t = QTime::currentTime(); //获取系统时间
    7. //将QTime类对象转换为字符串
    8. QString t = sys_t.toString("hh:mm:ss");
    9. //展示到ui界面
    10. ui->timeLabel->setText(t);
    11. }
    12. if(e->timerId() == time_id2){
    13. QTime sys_t = QTime::currentTime(); //获取系统时间
    14. //将QTime类对象转换为字符串
    15. QString t = sys_t.toString("hh:mm:ss");
    16. if(t == ui->timeEdit->text()){
    17. QString text = ui->textEdit->toPlainText();
    18. speecher->say(text.toUtf8());
    19. }
    20. }
    21. }
    22. Widget::Widget(QWidget *parent)
    23. : QWidget(parent)
    24. , ui(new Ui::Widget)
    25. {
    26. ui->setupUi(this);
    27. time_id1 = startTimer(1000);
    28. ui->timeLabel->setAlignment(Qt::AlignCenter);
    29. ui->timeEdit->setAlignment(Qt::AlignCenter);
    30. speecher = new QTextToSpeech(this);
    31. }
    32. Widget::~Widget()
    33. {
    34. delete ui;
    35. }
    36. //启动按钮
    37. void Widget::on_startBtn_clicked()
    38. {
    39. time_id2 = startTimer(1000);
    40. //提示信息
    41. QMessageBox box(QMessageBox::Information,"提示","已启动",QMessageBox::Ok,this);
    42. box.exec();
    43. }
    44. //停止按钮
    45. void Widget::on_stopBtn_clicked()
    46. {
    47. killTimer(time_id2);
    48. //提示信息
    49. QMessageBox box(QMessageBox::Information,"提示","已停止",QMessageBox::Ok,this);
    50. box.exec();
    51. }

    效果图:

    一、事件处理机制

    1.1 事件处理简介

    1. 1. 什么是事件? (重点)
    2. 事件是由窗口系统或者自身产生的,用以响应所发生的
    3. 各类事情,比如用户按下并释放了键盘或者鼠标、窗口因
    4. 暴露而需要重绘、定时器到时而应有所动作,等等
    5. 从某种意义上讲,事件比信号更原始,甚至可以认为大多
    6. 数信号其实都是由事件产生的。比如一个下压式按钮首先
    7. 感受到的是鼠标事件,
    8. 在进行必要的处理以产生按钮下沉
    9. 继而弹起的视觉效果之后,才会发射 clicked()信号
    10. 2. 如何处理事件? (重点)
    11. myWnd(自定义类) -继承-> QWidget -继承-> QObject
    12. 1> 当事件发生时,首先被调用的是QObject类中的虚函数event(),
    13. 其 QEvent型参数标识了具体的事件类型
    14. bool QObject:: event (QEvent* e)
    15. {
    16. if (e == mouseEvent)
    17. {
    18. void QWidget::mousePressEvent (QMouseEvent* e)
    19. void QWidget:: mouseReleaseEvent (QMouseEvent* e)
    20. }
    21. if(e == keyEvent){
    22. void QWidget::keyPressEvent (QMouseEvent* e)
    23. void QWidget:: keyReleaseEvent (QMouseEvent* e)
    24. }
    25. }
    26. 2> 作为QObject类的子类, QWidget类覆盖了其基类中的
    27. event()虚函数,并根据具体事件调用具体事件处理函数
    28. void QWidget::mousePressEvent (QMouseEvent* e)
    29. void QWidget::mouseReleaseEvent (QMouseEvent* e)
    30. void QWidget::keyPressEvent (QMouseEvent* e)
    31. void QWidget:: keyReleaseEvent (QMouseEvent* e)
    32. void QWidget::paintEvent (QPaintEvent* e):
    33. 3> 而这些事件处理函数同样也是虚函数,也可以被 QWidget类
    34. 的子类覆盖,以提供针对不同窗口部件类型的事件处理
    35. 4> 组件的使用者所关心的往往是定义什么样的槽处理什么样的信号,
    36. 而组件的实现者更关心覆盖哪些事件处理函数

    1.2 事件处理函数由来

    1. QObject类 提供了那些可以重写的虚函数
    2. [virtual] bool QObject::event(QEvent *e)
    3. // 参数:事件的类型
    4. QWidgets类, 提供了那些可以重写的虚函数
    5. [override virtual protected] bool QWidget::event(QEvent *event)
    6. [virtual protected] void QWidget::keyPressEvent(QKeyEvent *event)
    7. [virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event)
    8. [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)
    9. [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)
    10. [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
    11. [virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
    12. [virtual protected] void QObject::timerEvent(QTimerEvent *event)
    13. QPainter类 ---> 画家类
    14. void SimpleExampleWidget::paintEvent(QPaintEvent *)
    15. {
    16. QPainter painter(this);
    17. painter.setPen(Qt::blue);
    18. painter.setFont(QFont("Arial", 30));
    19. painter.drawText(rect(), Qt::AlignCenter, "Qt");
    20. }

    1.3 鼠标和键盘事件

    1> 事件处理函数

    1. //重写自己的键盘事件处理函数
    2. void keyPressEvent(QKeyEvent *event) override; //键盘按下事件处理函数
    3. void keyReleaseEvent(QKeyEvent *event) override; //键盘抬起事件处理函数
    4. //重写自己的鼠标事件处理函数
    5. void mousePressEvent(QMouseEvent *event) override; //鼠标按下事件处理函数
    6. void mouseReleaseEvent(QMouseEvent *event) override; //鼠标抬起事件处理函数
    7. void mouseDoubleClickEvent(QMouseEvent *event) override; //鼠标双击事件处理函数
    8. void mouseMoveEvent(QMouseEvent *event) override; //鼠标移动事件处理函数

    2> 案例

    1、ui界面

    2> 头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //键盘事件处理类
    5. #include //信息调试类
    6. #include //鼠标事件处理类
    7. QT_BEGIN_NAMESPACE
    8. namespace Ui { class Widget; }
    9. QT_END_NAMESPACE
    10. class Widget : public QWidget
    11. {
    12. Q_OBJECT
    13. public:
    14. Widget(QWidget *parent = nullptr);
    15. ~Widget();
    16. //重写自己的键盘事件处理函数
    17. void keyPressEvent(QKeyEvent *event) override; //键盘按下事件处理函数
    18. void keyReleaseEvent(QKeyEvent *event) override; //键盘抬起事件处理函数
    19. //重写自己的鼠标事件处理函数
    20. void mousePressEvent(QMouseEvent *event) override; //鼠标按下事件处理函数
    21. void mouseReleaseEvent(QMouseEvent *event) override; //鼠标抬起事件处理函数
    22. void mouseDoubleClickEvent(QMouseEvent *event) override; //鼠标双击事件处理函数
    23. void mouseMoveEvent(QMouseEvent *event) override; //鼠标移动事件处理函数
    24. private:
    25. Ui::Widget *ui;
    26. };
    27. #endif // WIDGET_H

    3> 源文件

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. //开启鼠标追踪功能
    9. this->setMouseTracking(true);
    10. }
    11. Widget::~Widget()
    12. {
    13. delete ui;
    14. }
    15. //键盘按下事件处理函数的实现
    16. void Widget::keyPressEvent(QKeyEvent *event)
    17. {
    18. qDebug()<<"有键盘被按下了,键值为"<key()<<" text:"<text();
    19. //可以对事件的键值进行判断
    20. switch(event->key())
    21. {
    22. case 'W':
    23. {
    24. if(ui->label->y() <= 0-ui->label->height()) //说明该组件已经全部脱离界面
    25. {
    26. ui->label->move(ui->label->x(), this->height()); //将组件放到最下面
    27. }
    28. ui->label->move(ui->label->x(), ui->label->y()-1);
    29. }
    30. break;
    31. }
    32. }
    33. //键盘抬起事件处理函数的实现
    34. void Widget::keyReleaseEvent(QKeyEvent *event)
    35. {
    36. qDebug()<<"有键盘被抬起了";
    37. }
    38. //鼠标按下事件处理函数的定义
    39. void Widget::mousePressEvent(QMouseEvent *event)
    40. {
    41. //判断是哪个鼠标被按下
    42. if(event->button() == Qt::LeftButton)
    43. {
    44. qDebug()<<"鼠标左键被按下,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    45. }else if(event->button() == Qt::RightButton)
    46. {
    47. qDebug()<<"鼠标右键被按下,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    48. }else if(event->button() == Qt::MidButton)
    49. {
    50. qDebug()<<"鼠标中间键被按下,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    51. }else
    52. {
    53. qDebug()<<"鼠标其他键被按下,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    54. }
    55. }
    56. //鼠标抬起事件处理函数的定义
    57. void Widget::mouseReleaseEvent(QMouseEvent *event)
    58. {
    59. //判断是哪个鼠标被抬起
    60. if(event->button() == Qt::LeftButton)
    61. {
    62. qDebug()<<"鼠标左键被抬起,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    63. }else if(event->button() == Qt::RightButton)
    64. {
    65. qDebug()<<"鼠标右键被抬起,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    66. }else if(event->button() == Qt::MidButton)
    67. {
    68. qDebug()<<"鼠标中间键被抬起,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    69. }else
    70. {
    71. qDebug()<<"鼠标其他键被抬起,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    72. }
    73. }
    74. //鼠标双击事件处理函数的定义
    75. void Widget::mouseDoubleClickEvent(QMouseEvent *event)
    76. {
    77. //判断是哪个鼠标被双击
    78. if(event->button() == Qt::LeftButton)
    79. {
    80. qDebug()<<"鼠标左键被双击,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    81. }else if(event->button() == Qt::RightButton)
    82. {
    83. qDebug()<<"鼠标右键被双击,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    84. }else if(event->button() == Qt::MidButton)
    85. {
    86. qDebug()<<"鼠标中间键被双击,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    87. }else
    88. {
    89. qDebug()<<"鼠标其他键被双击,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    90. }
    91. }
    92. //鼠标移动事件处理函数的定义
    93. void Widget::mouseMoveEvent(QMouseEvent *event)
    94. {
    95. //判断是哪个鼠标被移动
    96. qDebug()<<"鼠标全局位置:"<globalPos()<<" 组件内位置:"<pos();
    97. ui->label->move(event->pos()); //将组件跟随鼠标移动
    98. if(event->buttons() == Qt::LeftButton)
    99. {
    100. qDebug()<<"鼠标左键被移动,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    101. }else if(event->buttons() == Qt::RightButton)
    102. {
    103. qDebug()<<"鼠标右键被移动,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    104. }else if(event->buttons() == Qt::MidButton)
    105. {
    106. qDebug()<<"鼠标中间键被移动,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    107. }else
    108. {
    109. qDebug()<<"鼠标其他键被移动,全局坐标点:"<globalPos()<<" 组件内坐标:"<pos();
    110. }
    111. }

    1.4 鼠标事件案例

    1> 头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class Widget; }
    8. QT_END_NAMESPACE
    9. class Widget : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. Widget(QWidget *parent = nullptr);
    14. ~Widget();
    15. //重写鼠标事件处理函数
    16. void mouseMoveEvent(QMouseEvent *event) override;
    17. void mousePressEvent(QMouseEvent *event) override;
    18. private:
    19. Ui::Widget *ui;
    20. QPoint p; //记录鼠标相对于组件的位置
    21. };
    22. #endif // WIDGET_H

    2> 源文件

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. //设置纯净窗口
    9. this->setWindowFlag(Qt::FramelessWindowHint);
    10. }
    11. Widget::~Widget()
    12. {
    13. delete ui;
    14. }
    15. //鼠标移动事件处理函数
    16. void Widget::mouseMoveEvent(QMouseEvent *event)
    17. {
    18. this->move( event->globalPos() - p );
    19. }
    20. //鼠标按下事件处理函数
    21. void Widget::mousePressEvent(QMouseEvent *event)
    22. {
    23. if(event->button() == Qt::LeftButton)
    24. {
    25. p = event->globalPos() - this->pos();
    26. // 鼠标的全局坐标 组件的全局坐标
    27. //qDebug()<pos()<
    28. }else if(event->button() == Qt::RightButton)
    29. {
    30. this->close();
    31. }
    32. }

    1.5 定时器

    1> 所谓定时器,就是当定时器启动后,系统会每隔给定的时间自动调用某些函数

    2> 定时器的实现有两个版本:基于属性版本和事件处理版本

    3> 基于事件处理函数版本

    1. 1、无需实例化对象,调用的函数都是自身提供的
    2. 2、调用自身的成员函数startTimer(sec),启动一个定时器,那么系统就会每隔sec毫秒,自动调用自身的定时器事件处理函数,该函数返回创建的定时器id
    3. 3、调用自身成员函数killTimer(id)
    4. 4、重写定时器事件处理函数:void timerEvent(QTimerEvent *event);

    案例

    1、ui界面

    2、头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //定时器事件处理类
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class Widget; }
    8. QT_END_NAMESPACE
    9. class Widget : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. Widget(QWidget *parent = nullptr);
    14. ~Widget();
    15. void timerEvent(QTimerEvent *e) override; //定时器事件处理函数
    16. private slots:
    17. void on_startBtn_clicked();
    18. void on_closeBtn_clicked();
    19. private:
    20. Ui::Widget *ui;
    21. int timer_id; //定时器的id号
    22. };
    23. #endif // WIDGET_H

    3、源文件

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. }
    9. Widget::~Widget()
    10. {
    11. delete ui;
    12. }
    13. //启动定时器按钮对应的槽函数
    14. void Widget::on_startBtn_clicked()
    15. {
    16. timer_id = this->startTimer(1000);
    17. //功能:启动一个定时器
    18. //参数:超时时间,每隔给定的时间后,自动调用定时器事件处理函数
    19. //返回值:当前定时器的id号
    20. }
    21. //关闭定时器按钮对应的槽函数
    22. void Widget::on_closeBtn_clicked()
    23. {
    24. this->killTimer(timer_id); //关闭给定的定时器
    25. }
    26. //定时器事件处理函数
    27. void Widget::timerEvent(QTimerEvent *e)
    28. {
    29. if(e->timerId() == timer_id) //说明定时器1到位
    30. {
    31. QTime sys_t = QTime::currentTime(); //获取系统时间
    32. //将QTime类对象转换为字符串
    33. QString t = sys_t.toString("hh:mm:ss");
    34. //展示到ui界面
    35. ui->timeLab->setText(t);
    36. }
    37. // if(e->timerId() == timer_id_1) //说明定时器1到位
    38. // {
    39. // }
    40. }

    1.6 绘制事件

    1> 当QT界面运行时,其实主要调用了绘制事件,将图形化界面绘制在计算机上

    2> 绘制事件的调用时机:第一次展示窗口、窗口因最大化、最小化恢复正常状态、窗口因被覆盖后再次暴露、更改窗口大小、调用update函数都会调用绘制事件

    3> 绘制事件中的处理逻辑,一般在绘制事件中,实例化一个画家类的对象,使用还对象,对相关矢量文字、各种图形、图形进行相关绘制到ui界面

    4> 事件处理函数原型:virtual void paintEvent(QPaintEvent *event);

    头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //绘制事件类
    5. #include //信息调试类
    6. #include //画家类
    7. QT_BEGIN_NAMESPACE
    8. namespace Ui { class Widget; }
    9. QT_END_NAMESPACE
    10. class Widget : public QWidget
    11. {
    12. Q_OBJECT
    13. public:
    14. Widget(QWidget *parent = nullptr);
    15. ~Widget();
    16. //重写绘制事件处理函数
    17. void paintEvent(QPaintEvent *event) override;
    18. private:
    19. Ui::Widget *ui;
    20. };
    21. #endif // WIDGET_H

    源文件

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. }
    9. Widget::~Widget()
    10. {
    11. delete ui;
    12. }
    13. //绘制事件处理函数的定义
    14. void Widget::paintEvent(QPaintEvent *event)
    15. {
    16. //实例化一个画家
    17. QPainter painter(this);
    18. //实例化一个画笔
    19. QPen pen; //使用无参构造
    20. pen.setColor(QColor("blue"));
    21. pen.setStyle(Qt::SolidLine); //设置线型
    22. pen.setWidth(5);
    23. //pen.setBrush(QBrush(Qt::RadialGradientPattern));
    24. //将画笔给画家安排上
    25. painter.setPen(pen);
    26. //给画家偏移起始坐标点
    27. painter.translate(this->width()/2, this->height()/2);
    28. //给画家 偏移坐标系
    29. painter.rotate(0); //旋转坐标系
    30. painter.setBrush(QBrush(QColor("skyblue"))); //给画家设置画刷
    31. //画个椭圆
    32. painter.drawEllipse(QPoint(0,0), 200,100);
    33. /***************************************************************/
    34. painter.translate(-this->width()/2, -this->height()/2);
    35. //绘制矢量文字
    36. pen.setColor(QColor("red"));
    37. painter.setPen(pen);
    38. //给画家设置字体
    39. painter.setFont(QFont("隶书", 40, 2));
    40. //绘制矢量文字
    41. painter.drawText(this->rect(), Qt::AlignCenter, "好好学习\n天天向上");
    42. }

    1.7 绘制事件案例(画图板)

    1> 头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //鼠标事件
    5. #include //绘制事件
    6. #include //画家类
    7. #include //图像引擎类
    8. QT_BEGIN_NAMESPACE
    9. namespace Ui { class Widget; }
    10. QT_END_NAMESPACE
    11. class Widget : public QWidget
    12. {
    13. Q_OBJECT
    14. public:
    15. Widget(QWidget *parent = nullptr);
    16. ~Widget();
    17. //重写事件处理函数
    18. void mouseMoveEvent(QMouseEvent *event) override; //鼠标移动事件
    19. void mousePressEvent(QMouseEvent *event) override; //鼠标点击事件
    20. void paintEvent(QPaintEvent *event) override; //绘制事件
    21. private:
    22. Ui::Widget *ui;
    23. //定义膜的指针
    24. QPixmap *pix;
    25. //定义起始点坐标
    26. QPoint startPoint;
    27. };
    28. #endif // WIDGET_H

    2> 源文件

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. //构造一个膜的对象
    9. pix = new QPixmap(this->size()); //用当前界面大小构造一个膜
    10. pix->fill(Qt::white); //设置膜的填充色
    11. }
    12. Widget::~Widget()
    13. {
    14. delete ui;
    15. }
    16. //鼠标移动事件处理函数
    17. void Widget::mouseMoveEvent(QMouseEvent *event)
    18. {
    19. //定义一个画家,在膜上进行作画
    20. QPainter p1(pix);
    21. QPen pen;
    22. pen.setColor(QColor("red"));
    23. pen.setWidth(2);
    24. p1.setPen(pen); //红笔
    25. //不断在两点之间画直线
    26. p1.drawLine(startPoint, event->pos());
    27. //更新起始点
    28. startPoint = event->pos();
    29. //手动调用更细函数
    30. this->update();
    31. }
    32. //鼠标按压事件处理函数
    33. void Widget::mousePressEvent(QMouseEvent *event)
    34. {
    35. //获取起始位置
    36. startPoint = event->pos();
    37. }
    38. //绘制事件处理函数
    39. void Widget::paintEvent(QPaintEvent *event)
    40. {
    41. //定义一个画家,在界面上进行作画
    42. QPainter p2(this);
    43. //绘制图像
    44. p2.drawPixmap(QPoint(0,0), *pix);
    45. }

  • 相关阅读:
    Go的安装及环境变量的配置
    预制菜还没火,加盟商已经亏惨了
    微信小程序 uniapp奶茶点单系统r4112
    技术公司职位
    【八股】计算机网络-HTTP和HTTPS的区别、HTTPS加密传输原理
    【DL】基于pytorch搭建BP神经网络/人工神经网络/多层感知机/全连接神经网络的鸢尾花分类
    MKS GM50A MFC GUI 软件使用指南GE50A调零原理及步骤PPT
    ffmpeg下载地址
    [mysql] 深入分析MySQL版本控制MVCC规则--实测 (mysql 8.0 innodb引擎)
    Java调用com组件之jacob
  • 原文地址:https://blog.csdn.net/weixin_54147737/article/details/133045489