QT 系统学习 day04 事件(鼠标,键盘), UDP 通信, TCP 通信,多个定时器,重写绘画事件

news2024/11/15 10:57:57

1. 事件  (有 键盘按下, 鼠标按下, 鼠标双击等)

 1.重写键盘按下事件,

  函数: void keyPressEvent(QKeyEvent *event)    /*** 按键按下事件 ***/

   代码:

 void keyPressEvent(QKeyEvent *event) /*** 按键按下事件 ***/
    {
        qDebug() << "按下的按键个数:" << event->count() << endl;
        qDebug() << "按下的按键码:" << event->key() << endl; // 按键码需要参考 Qt:Key 按键枚举表
        qDebug() << "按下的按键字符:" << event->text() << endl; // 按下按键的字符
    }

   2.重写键盘 按键松开事件

函数: void keyReleaseEvent(QKeyEvent *event) /*** 按键松开事件 ***/

 void keyReleaseEvent(QKeyEvent *event) /*** 按键松开事件 ***/
    {
        qDebug() << "松开的按键个数:" << event->count() << endl;
        qDebug() << "松开的按键码:" << event->key() << endl; // 按键码需要参考 Qt:Key 按键枚举表
        qDebug() << "松开的按键字符:" << event->text() << endl; // 按下按键的字符
    }

3.重写 鼠标按下事件

函数:void mousePressEvent(QMouseEvent *event) /*** 鼠标按下事件 ***/

代码:

void mousePressEvent(QMouseEvent *event) /*** 鼠标按下事件 ***/
    {
        /***** 案例:我的鼠标有 左键,右键,前进键和后退键 ****/
        switch ((unsigned int)event->button()) { // 获取按下的按键
        case Qt::LeftButton:
                mouse_flag = true;
                qDebug() << "鼠标左键按下" << endl;
            break;
        case Qt::RightButton:
                qDebug() << "鼠标右键按下" << endl;

                //Menu->exec(QCursor::pos());         //QCursor::pos()获取鼠标的全局坐标
                //Menu->exec(event->globalPos());       //event->globalPos()获取鼠标的全局坐标
            break;
        case Qt::BackButton:
                qDebug() << "鼠标后退键按下" << endl;
            break;
        case Qt::ForwardButton:
                qDebug() << "鼠标前进键按下" << endl;
            break;
        case Qt::MiddleButton:
                qDebug() << "鼠标中间滚轮键按下" << endl;
            break;
        }
    }

4.重写 鼠标松开事件

函数: void mouseReleaseEvent(QMouseEvent *event)     /*** 鼠标松开事件 ***/

代码:

void mouseReleaseEvent(QMouseEvent *event)     /*** 鼠标松开事件 ***/
    {
        /***** 案例:我的鼠标有 左键,右键,前进键和后退键 ****/
        switch ((unsigned int)event->button()) { // 获取松开的按键
        case Qt::LeftButton:
                mouse_flag = false;
                qDebug() << "鼠标左键松开" << endl;
            break;
        }
    }

5.重写鼠标双击事件

函数:void mouseDoubleClickEvent(QMouseEvent *event); /*** 鼠标双击事件 ***/

代码:

void mouseDoubleClickEvent(QMouseEvent *event)//鼠标双击事件
    {
        qDebug()<<"鼠标双击事件";
    }

6.重写鼠标移动事件

函数:void mouseMoveEvent(QMouseEvent *event);        /*** 鼠标移动事件 ***/

代码:

因为要用到 this 所以我们在 .h 文件里面声明,.cpp 文件里面实现 .


void Widget::mouseMoveEvent(QMouseEvent *event)
{
    /***** 思考:为什么需要按键按下并鼠标移动才触发时间 ? ****
     * QWidget 默认关闭焦点,所以需要打开焦点
     * 使用这个函数:this->setMouseTracking(true); // 设置鼠标焦点使能
     * ***********************************************/
    if(this->mouse_flag)
    {
        qDebug() << "全局坐标:" << event->globalPos() << endl;//全局变量是整个电脑屏幕 处在的位置
        qDebug() << "局部坐标:" << event->localPos() << endl;//局部变量是自己打开的窗口的处在的位置
        
    }
}

7.重写鼠标中间/滚轮事件

函数:  void wheelEvent(QWheelEvent *event)            /*** 鼠标中间/滚轮事件 ***/

代码:

 void wheelEvent(QWheelEvent *event)            /*** 鼠标中间/滚轮事件 ***/
    {
        /**** 获取滚动的距离 ******
         * QPoint angleDelta()
         * ******************************************************/
        QPoint point = event->angleDelta(); //获取距离
        qDebug() << "距离:" << point.y() << endl;
        qDebug() << "方向:" << (point.y() >= 0 ? "向前" : "向后") << endl;
    }

8.重写定时器事件 

函数:  void timerEvent(QTimerEvent *)

代码:

#include <QTimerEvent>//定时器事件
public: /*** 定时器事件 ****/
    void timerEvent(QTimerEvent *)
    {
        static int count = 0;
        //qDebug() << "闹钟的数量:" << ++count << endl;
    }

启动定时器事件的 代码

   /***** 定时器事件 *******/
    this->startTimer(1000); // 1000 毫秒 = 1秒钟 , 计数到1秒则触发事件 timerEvent

9. 重写绘图事件  (画圆,画点,画线,)

函数:  void paintEvent(QPaintEvent *) /**** 绘图事件 ***/

代码:

void paintEvent(QPaintEvent *) /**** 绘图事件 ***/
    {
        QPainter p(this);
        /***** 画刷 ********************************/
        QBrush Brush = p.brush(); // 获取画家手上的刷子
        Brush.setColor(QColor(255,0,0));
        p.setBrush(Brush);

        /***** 画笔 ********************************/
        QPen Pen = p.pen();
        Pen.setColor(QColor(0,255,0)); //设置画笔颜色
        Pen.setWidth(4); //设置画笔大小
        Pen.setStyle(Qt::DashLine); //设置画笔样式
        p.setPen(Pen);
        p.setFont(QFont("宋体",16));
        /**** 绘制形状 ****/
        p.drawPoint(200,200); //画点
        p.drawLine(QPoint(100,100),QPoint(200,200)); //画线
        p.drawRect(100,100,100,100); //画矩形 drawRect(int x, int y, int w, int h)
        p.drawEllipse(QPoint(150,150),50,50); //画圆 (const QPoint &center, int rx, int ry)
        p.drawImage(QPoint(200,200),QImage("://QQ图片20221125090254.png"));//画一张图片

        Pen.setColor(QColor(0,0,255)); //设置画笔颜色
        p.setPen(Pen);
        p.setFont(QFont("宋体",16));
        p.drawText(QPoint(300,20),"老师的牛逼");//形成一个文本框,里面写了 文字
    }


2.多个定时器

#include <QTimer> //定时器类

#include <QTime> //时间类

1. 定义指针的变量     QTimer *Timer1;//定时器类对象

2.实列化对象    Timer1 = new QTimer(this);

3.建立信号连接 等定时器到了时间就, 发出信号     connect(Timer1,SIGNAL(timeout()),this,SLOT(slot_Timer1()));

4. 打开定时器  Timer1->start(100); // 100毫秒 = 0.1 毫秒 , 计数到0.1秒则触发 timeout() 信号


3.   将控件安装事件过滤器  (就是发生了事件  上面的事件都算, 重新交给一个人来处理,。  本来是交给他的父类的!! )

1.给控件加上  一个捕获事件的能力,(本来捕获事件的能力都是 widget 界面的)

  ui->progressBar->grabKeyboard();//设置键盘捕获事件

2.给控件安装事件过滤器

  /*** 将控件安装事件过滤器 ***/
    ui->progressBar->installEventFilter(this);;; //ui->progressBar 进度条控件的事件交给 Widget 去处理

   3.设置控件获取焦点 (因为平时焦点都是在 界面上 ,而我们需要让 控件获取焦点的能力)

焦点窗口

所谓的焦点窗口,指的是当前时刻拥有键盘输入的窗口。

补充两个概念,活动窗口和前景窗口。活动窗口,指的是当前时刻与用户进行交互的窗口;前景窗口,指的是显示器最顶层窗口,前景窗口永远在其他窗口上方,不被遮挡。
设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于 搜索框设置了焦点。
这就是说 有了焦点,我们把鼠标放到控件上,窗口就知道我们操作的是 控件,假如没有焦点,那么窗口就不知道。
  ui->progressBar->setFocus();//控件获取焦点

4.重写 事件过滤器

函数:bool eventFilter(QObject *watched, QEvent *event); /**** 事件过滤 ****/

代码:


#include <QDebug> /*** 调试类 ***/
#include <QProgressBar> /*** 进度条类 ***/
#include <QKeyEvent>    /*** 按键事件类 ****/
/*** 注意事项:没有处理就返回false,处理了就返回true   完成了也可以返回 false 可以让下一级来操作  ***/
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->progressBar) // 说明是我的 进度条控件 发出的事件
    {
        QProgressBar *ProgressBar = (QProgressBar *)watched;//把类型强转
        /*** QEvent 事件基类中有一个 type() 函数获取事件的类型,可以参考 QEvent::Type 枚举表 ****/
        if(event->type() == QEvent::KeyPress) /*** 按键事件 ****/
        {
            qDebug() << "进度条控件发出事件" << endl;
            QKeyEvent *KeyEvent = (QKeyEvent *)event;
            qDebug() << "按下的按键:" << KeyEvent->text() << endl;
            int x = ProgressBar->x();
            int y = ProgressBar->y();

            switch ((unsigned int)KeyEvent->key()) {
            case Qt::Key_Up:
                    ProgressBar->move(x,y-10);return true;
            case Qt::Key_Down:
                    ProgressBar->move(x,y+10);return true;
            case Qt::Key_Left:
                    ProgressBar->move(x-10,y);return true;
            case Qt::Key_Right:
                    ProgressBar->move(x+10,y);return true;
            }
        }
    }

    return false; /*** 没有处理 ***/
}


4.UDP 网络连接

1.在学习UDP的时候,我们需要在

 2. 学习UDP  的建立步骤

1.头文件 : #include <QUdpSocket> /*** 网络模块 ***/
                        #include <QMessageBox> /** 标准对话框 ***/

 2. 建立UDP 网络套接字对象   QUdpSocket *UdpSocket; 

3.实列话对象  UdpSocket = new QUdpSocket(this);

4. 知道 UDP 的函数 并且运用 


/******************* QUdpSocket 类 ******************
 * 绑定:
 *      ip地址和端口号 : bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform);

 *      默认本地ip:     bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform);
 * 发送:qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

 * 接收:qint64 readDatagram(char *data, qint64 maxlen, QHostAddress *host = Q_NULLPTR, quint16 *port = Q_NULLPTR);
 * 

信号函数:
 *      套接字有数据可读 : void readyRead()
 * **************************************************/

5. UDP 绑定 IP  和端口号 

我才用的 是 默认本地ip  的绑定


void Udp::slot_pushButton_bind()
{
    QString ip = ui->lineEdit_ip_bind->text();//获取自己写的 ip 地址
    int port = ui->lineEdit_port_bind->text().toInt();//获取端口号

    bool ok = false;//判断自己是否写了 ip 地址
    if(ip.isEmpty() == true)
    {
        ok = UdpSocket->bind(port);//采用默认 IP地址绑定。
    }else
    {
        ok = UdpSocket->bind(QHostAddress(ip),port);//采取 自己写的 ip 地址和 端口号 来绑定
    }

    if(ok == true)
    {
        ui->pushButton_bind->setText("绑定成功");
        ui->pushButton_bind->setEnabled(false);
    }
    else
    {
        QMessageBox::warning(this,"绑定警告","绑定失败,端口号以被使用");//警告消息对话框
    }
}

  6. UDP 发送数据

函数: writeDatagram(参数1,参数2,参数3) 

参数1,数据。 (类型需要转 UTF-8)

参数2 , 目标用户的 ip  

参数3   , 目标用户的port 

代码:

void Udp::slot_pushButton_send()
{
    QString ip = ui->lineEdit_ip_send->text();//获取  目标 的IP
    int port = ui->lineEdit_port_send->text().toInt();获取 目标的port 
    QString text = ui->textEdit_write->toPlainText();// 获取发送的内容

    UdpSocket->writeDatagram(text.toUtf8(),QHostAddress(ip),port);//发送数据
}

7.UDP 接收信息,

1. 首先建立连接 

connect(UdpSocket,SIGNAL(readyRead()),this,SLOT(slot_UdpSocket_readyRead()));

参数1 : UDP 的指针, 参数2  有数据可以接收的信号,  

参数3   界面指针             参数4  自己写的槽函数,接收数据

2.直接接收数据


void Udp::slot_UdpSocket_readyRead()
{
    char *buf = new char[1024]; /*** 申请空间 ***/
    memset(buf,0,1024);//清除空间,防止有脏数据
    QHostAddress host; //对方的主机
    quint16 port;      //对方的端口

    UdpSocket->readDatagram(buf,1024,&host,&port);//我这里有一个疑问,接收的空间 ,没有数据大咋办,一次接收后,还会有第二次接收吗??
    ui->textEdit_read->append(buf);

    delete buf; /*** 释放空间 ***/
}


5.TCP 网络传输数据  (服务器部分)

1.头文件

#include <QTcpServer>   /** TCP 服务器类 ***/
#include <QTcpSocket>   /** TCP 套接字类 ***/

2. 建立TCP  网络套接字对象   TCPsever *sevser

3.实列话对象   sevser = new TCPsever;

4. 知道 TCP 服务器  的函数 并且运用 


/********** QTcpServer 服务器类 *******
 * ①绑定监听 : bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
 * ②等待响应|用户连入信号 : void newConnection()
 * ③接入已挂起的客户端 : QTcpSocket *QTcpServer::nextPendingConnection()
 * **********************************************************************************/
/********** QTcpSocket 套接字类 ********
 * 连接: void connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)
 * 断开: void disconnectFromHost()
 * 读取:
 *      QByteArray read(qint64 maxSize)     指定读取长度
 *      QByteArray readAll()                读取全部内容
 * 写入:
 *      qint64 write(const char *data)              发送字符串内容
 *      qint64 write(const QByteArray &byteArray)   发送QByteArray内容
 * 信号:
 *      void readyRead() 有数据可读发出信号
 *      void connected() 连接成功信号
 *      void disconnected() 断开连接信号
 * 数据函数:
 *      qint64 QAbstractSocket::readBufferSize() 缓存区大小
 *                              ***** 缓冲区可读内容长度
 *
 * 获取IP地址:QHostAddress peerAddress() const
 * 获取端口号:quint16 peerPort() const
 * ***************************************************************************************/
/********************* QHostAddress 类 ***************************************************
 * QHostAddress::Any 枚举值,双栈协议
 * QString QHostAddress::toString() const 的ip地址转字符串
 * **************************************************************************************/

5. 申请服务器TCP类空间 QTcpServer*  TcpServer = new QTcpServer(this);


6. TCP  绑定 ip 和端口号 

函数 :listen(QHostAddress::Any,port); 

参数1    QHostAddress类提供一个IP地址。

QHostAddress类  这个类提供一种独立于平台和协议的方式来保存IPv4和IPv6地址。

参数2  这个电脑可以绑定的 端口号 

代码:

void TCPsever::slot_pushButton_bind()
{
    QString ip = ui->lineEdit_ip->text();
    int port = ui->lineEdit_port->text().toInt();

    TcpServer->listen(QHostAddress::Any,port); //双栈绑定
}

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

7.为客户的连接 建立信号连接 (目的 当有客户连接的时候,我们可以知道并且获取 客户的 ip 和 端口号 )

  connect(TcpServer,SIGNAL(newConnection()),this,SLOT(slot_TcpServer()));

参数1    TCP类空间的指针 , 参数2  用户连接信号

8.读取数据 建立连接  

connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));

参数1   TCP类空间的指针      参数2  有数据可以读取的信号函数

9.发送过来的数据读取

代码:

void TCPsever::slot_TcpSocket_readyRead()
{
    QTcpSocket *TcpSocket = (QTcpSocket *)sender();
    QByteArray buf = TcpSocket->readAll();

    ui->textEdit->append(buf);
}



6.TCP 网络传输数据  (客户端部分)

这里只有函数可以讲

1.建立对象,并且实列化对象   QTcpSocket *TcpSocket; /*** TCP套接字类指针 **/ 

                                                     TcpSocket = new QTcpSocket(this);  

2.关于客户端的函数, 

/********** QTcpSocket 套接字类 ********
 * 连接: void connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)
 * 断开: void disconnectFromHost()
 * 读取:
 *      QByteArray read(qint64 maxSize)     指定读取长度
 *      QByteArray readAll()                读取全部内容
 * 写入:
 *      qint64 write(const char *data)              发送字符串内容
 *      qint64 write(const QByteArray &byteArray)   发送QByteArray内容
 * 信号:
 *      void readyRead() 有数据可读发出信号
 *      void connected() 连接成功信号
 *      void disconnected() 断开连接信号
 * 数据函数:
 *      qint64 QAbstractSocket::readBufferSize() 缓存区大小
 *                              ***** 缓冲区可读内容长度
 * ***************************************************************************************/

3.连接服务端 

函数:void connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)

参数1  IP   参数2  端口号

代码:

void TCPclient::slot_pushButton_connect()
{
    QString ip = ui->lineEdit_ip->text();//获取要连接的服务器的 ip 
    int port = ui->lineEdit_port->text().toInt();//获取要连接的服务器的 端口号

    TcpSocket->connectToHost(QHostAddress(ip),port);//连接服务器
}

4. 为连接服务器成功做准备, 主要是建立一个信号连接,来知道,与服务器连接成功了

 connect(TcpSocket,SIGNAL(connected()),this,SLOT(slot_TcpSocket_connected()));

第二个参数 是 一个连接服务器成功的信号, 

代码:


void TCPclient::slot_TcpSocket_connected()
{
    ui->pushButton_connect->setText("连接成功");
    ui->pushButton_send->setEnabled(true); //使能发送按钮
}

5.为服务器断开连接做准备, 主要是建立一个信号连接,来知道,与服务器服务器断开连接了

 connect(TcpSocket,SIGNAL(disconnected()),this,SLOT(slot_TcpSocket_disconnected()));

代码:

void TCPclient::slot_TcpSocket_disconnected()
{
    ui->pushButton_connect->setText("已断开连接");
    ui->pushButton_send->setEnabled(false); //使能发送按钮
}

6.客户端向服务端发送数据 

函数:write(text.toUtf8());

代码:


void TCPclient::slot_pushButton_send()
{
    QString text = ui->textEdit_send->toPlainText();//读取要发送的数据
    TcpSocket->write(text.toUtf8());//向服务器发送数据
}

7.客户端 读取 服务端发送的数据 

建立连接

 connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));//和之前一样

代码:

void TCPclient::slot_TcpSocket_readyRead()
{
    QByteArray buf = TcpSocket->readAll();//读取数据
    ui->textEdit_read->append(buf);
}


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

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

相关文章

【吴恩达机器学习笔记】十五、大规模机器学习

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

低代码开发平台——体验系统的重要性

什么是优秀的体验&#xff1f; 简而言之&#xff0c;优质的体验意味着可以随时随地根据客户的需求提供服务&#xff0c;这在数字化的世界中&#xff0c;意味着真正的多重体验。Gartner早在2018年就定义了MXDP&#xff08;多体验开发平台&#xff09;&#xff0c;以应对我们日常…

游戏开发38课 unity 模板测试

ShaderLab 命令&#xff1a;模板 配置与 GPU 上的模板缓冲区相关的设置。 模板缓冲区为帧缓冲区中的每个像素存储一个 8 位整数值。为给定像素执行片元着色器之前&#xff0c;GPU 可以将模板缓冲区中的当前值与给定参考值进行比较。这称为模板测试。如果模板测试通过&#xff…

liunx如何重启mysql

Linux如何重启MySQL Linux中重启MySQL可以使用service mysql restart命令和脚本启动方式/etc/inint.d/mysql restart。 推荐&#xff1a;MySQL教程 其他命令如下&#xff1a; 一、 启动 1、使用 service 启动&#xff1a;service mysql start 2、使用 mysqld 脚本启动&am…

使用redis做分布式锁

思路步骤 获取锁, 使用 SETNX 命令设置一个key.如果没获取到&#xff0c;从新拿锁&#xff0c;返回步骤1 ; 从新拿锁可以设置等待时间;也可以记录拿锁次数为了做“避免死循环”.如果获取到&#xff0c;使用 EXPIRE 给锁加存活时间&#xff1b;接步骤3&#xff0c;执行业务&…

微机----------------中断控制器8259A(可编程的中断控制器)

目录 功能8259A的引脚8259A的工作方式中断响应顺序8259A的中断优先级管理8259A中断屏蔽管理⭐8259A的中断结束管理功能 ①单片825能管理8级中断,并且可级联管理64级 ②可对任一级中断单独屏蔽或允许 ③中断被响应后,可直接提供中断类型号 ④可通过编程选择其工作方式 IRR中断…

C++入门篇

入门C命名空间命名空间定义命名空间的使用C输入&#xff0c;输出缺省参数缺省参数概念缺省参数分类函数重载函数重载概念C支持函数重载的原因引用引用概念引用特性具体应用const修饰的常量进行引用&#xff08;常引用&#xff09;传值&#xff0c;传引用的效率引用和指针的区别…

【无标题】3 GENERIC语句 和 INTEGER类型

【VHDL】【作业】3 GENERIC语句 和 INTEGER类型 文章目录【VHDL】【作业】3 GENERIC语句 和 INTEGER类型前言什么是GENERIC语句&#xff1f;32位加法器仿真波形总结每天进步一点点 笔记仅供自学&#xff0c;用来回看复习&#xff0c;不一定适合你&#xff0c;如有错误请指出。前…

SpringBoot:概述

Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;开发者能快速上手。 &#xff5e; 本篇内容包括&#xff1a;Spring Boo…

[选型] 实时数仓之技术选型

数仓技术路线选型 对于已有的hive数据仓&#xff0c;怎样改造成实时数仓的要求呢&#xff1f; 2.关于实时数仓的选型 如果选择hbase&#xff0c;建议选择kudu 如果选择kudu, 还可以选择doris 如果选择doris&#xff0c;建议选择iceberg 以上三种选择&#xff0c;要配合具体…

C++实现身份证号码过滤与排序

1.描述 警察办案里检索到一批(n个)身份证号码&#xff0c;希望按出生日期对它们进行从大到小排序&#xff0c;如果有相同日期&#xff0c;则按身份证号码大小进行排序&#xff0c;如果是错误的身份证号&#xff0c;则从排序列表中删除(仅需判断前两位省级地区编码是否在下面的…

知识图谱-KGE-语义匹配-双线性模型-2016:NAM

【paper】 Probabilistic Reasoning via Deep Learning: Neural Association Models【简介】 本文是中科大和科大讯飞联合发表在 IJCAI 2016 上的工作&#xff0c;本文提出了 NAM&#xff08;Neural Association Model&#xff09;用于概率推理&#xff0c;并具体化为 DNN&…

十二月7号

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 boot:引导 loader&#xff1a;加载 2.uboot是引导加载程序中的一种 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X8…

Blazor 部署 pdf.js 不能正确显示中文资源解决办法

原文链接 [https://www.cnblogs.com/densen2014/p/16964858.html] 在Blazor项目嵌入 pdf.js 时不能正确显示中文,浏览器F12显示如下错误 错误 l10n.js /web/locale/locale.properties not found. 我找到了解决方案。它不仅消除了上面提到的错误&#xff08;即 404 - locale.p…

nextjs13 webpack5 使用wasm报错

问题描述&#xff1a; 在next 13, webpack 5, react 18的项目中使用Rust编写的wasm报错&#xff1a; ./node_modules/image-map-path/image_map_path_bg.wasm Module parse failed: Unexpected character (1:0) The module seem to be a WebAssembly module, but module is n…

freemarker

文章目录创建项目引入依赖创建配置文件创建启动类和测试类语法listMapif运算符处理空值使用??指定缺失变量默认值内建函数集合长度数据类型布尔值时间类型数值类型字符串类型sequence序列类型hash类型常见指令assign自定义变量指令json转成对象实例list通过下标取值map取值通…

「Redis数据结构」集合对象(Set)

「Redis数据结构」集合对象&#xff08;Set&#xff09; 文章目录「Redis数据结构」集合对象&#xff08;Set&#xff09;一、概述二、结构三、编码转换四、小结一、概述 Set是Redis中的单列集合&#xff0c;其特点为不保证有序性、保证元素唯一、可以求交集、并集、差集。 从…

Python入门自学进阶-Web框架——28、DjangoAdmin项目应用-只读字段与后端表单验证

有时候&#xff0c;记录的某些字段在生成后就不允许再修改了&#xff0c;这时前端只能显示&#xff0c;不能修改。这时&#xff0c;可在AdminClass中进行设置&#xff1a;readonly_fields[字段名&#xff0c;字段名&#xff0c;。。。]&#xff0c;前端格式就显示成只显示不能修…

联想电脑怎么录屏?这3个方法,轻松解决

录屏是现在最常见的办公功能之一&#xff0c;最近有朋友问联想电脑怎么录屏。联想电脑是使用Windows系统的。如果想用联想电脑录屏&#xff0c;可以使用Windows系统自带了的录屏软件进行录屏。下面小编将详细的介绍3个方法&#xff0c;解决联想电脑怎么录屏的问题&#xff0c;感…

8086寻址方式图解

目录 1&#xff1a;立即寻址 2&#xff1a;寄存器寻址 3&#xff1a;直接寻址&#xff08;存储器直接寻址&#xff09; 4&#xff1a;寄存器间接寻址&#xff08;重点&#xff09; 5&#xff1a;基址寻址&#xff08;相对寻址&#xff09; 6&#xff1a;变址寻址 &#x…