嵌入式养成计划-45----QT--事件机制--定时器事件--键盘事件和鼠标事件--绘制事件
一百一十五、事件机制
- 当这件事情发生时,会自动走对应的函数处理(重写的事件函数)
115.1 事件处理简介
- 什么是事件? (重点)
- 件是由窗口系统或者自身产生的,用以响应所发生的各类事情,
- 比如用户按下并释放了键盘或者鼠标、窗口因暴露而需要重绘、定时器到时而应有所动作,等等
- 从某种意义上讲,事件比信号更原始,甚至可以认为大多数信号其实都是由事件产生的。
- 比如一个下压式按钮首先感受到的是鼠标事件,在进行必要的处理以产生按钮下沉继而弹起的视觉效果之后,才会发射 clicked()信号
- 如何处理事件? (重点)
- myWnd(自定义类) -继承-> QWidget -继承-> QObject
- 当事件发生时,首先被调用的是QObject类中的虚函数event(),
其 QEvent型参数标识了具体的事件类型bool QObject:: event (QEvent* e) {if (e == mouseEvent){void QWidget::mousePressEvent (QMouseEvent* e)void QWidget:: mouseReleaseEvent (QMouseEvent* e)}if(e == keyEvent){void QWidget::keyPressEvent (QMouseEvent* e)void QWidget:: keyReleaseEvent (QMouseEvent* e)} } - 作为QObject类的子类, QWidget类覆盖了其基类中的
event()虚函数,并根据具体事件调用具体事件处理函数void QWidget::mousePressEvent (QMouseEvent* e) void QWidget::mouseReleaseEvent (QMouseEvent* e) void QWidget::keyPressEvent (QMouseEvent* e) void QWidget:: keyReleaseEvent (QMouseEvent* e) void QWidget::paintEvent (QPaintEvent* e) - 而这些事件处理函数同样也是虚函数,也可以被 QWidget类的子类覆盖,以提供针对不同窗口部件类型的事件处理
- 组件的使用者所关心的往往是定义什么样的槽处理什么样的信号,而组件的实现者更关心覆盖哪些事件处理函数
115.2 事件处理函数由来
QObject类 提供了那些可以重写的虚函数[virtual] bool QObject::event(QEvent *e) // 参数:事件的类型QWidgets类, 提供了那些可以重写的虚函数[override virtual protected] bool QWidget::event(QEvent *event)[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event)[virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event)[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)[virtual protected] void QObject::timerEvent(QTimerEvent *event)QPainter类 ---> 画家类void SimpleExampleWidget::paintEvent(QPaintEvent *){QPainter painter(this);painter.setPen(Qt::blue);painter.setFont(QFont("Arial", 30));painter.drawText(rect(), Qt::AlignCenter, "Qt");}
一百一十六、定时器事件
-
qt的定时器事件提供了两这种实现方式,分别是 基于对象版本 和 基于事件处理函数
-
基于事件处理函数
1.不需要手动书写信号函数,不需要写信号和槽 2.使用的是自己的成员函数,启动定时器函数、关闭定时器函数、定时器时间超时时的函数 3.功能:让系统在每隔一定的时间,自动执行某段代码 4.所需要的函数:startTimer(int sec); //自身的成员函数,表示启动一个定时器,给定毫秒,返回定时器的idkillTimer(int id);//自身的成员函数,表示关闭一个定时器,给定定时器idtimerEvent(QTimerEvent *e); //定时器处理的函数,表示定时器给定的时间到了,就自动执行该函数的内容 -
ui界面:

- 示例 :
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); } Widget::~Widget() {delete ui; } //启动按钮对应的槽函数处理 void Widget::on_startBtn_clicked() {if(ui->startBtn->text() == "启动"){//启动一个定时器tId = startTimer(1000);//将按钮文本设置成关闭ui->startBtn->setText("关闭");}else{//关闭一个定时器killTimer(tId);//将文本设置成启动ui->startBtn->setText("启动");} } //时间事件的函数处理 void Widget::timerEvent(QTimerEvent *e) {//判断哪个定时器超时if(e->timerId() == tId){ // static int num = 0; // ui->timeLab->setNum(++num);QTime sys_time = QTime::currentTime(); //获取当前系统时间//把系统时间转换成字符串QString s = sys_time.toString("hh::mm::ss");//将系统时间放入标签中ui->timeLab->setText(s);//居中显示ui->timeLab->setAlignment(Qt::AlignCenter);} }
- 示例 :
-
基于对象版本
- 需要用QTimer定时器类实例化一个对象
- 用对象调用启动定时器函数:start(int sec),让系统每隔sec毫秒,触发一个信号timeout
- 我们可以将timeout信号与自定义的槽函数连接,处理槽函数的逻辑代码
- 用对象调用关闭定时器函数: stop()
- 示例 :
//启动2对应的槽函数处理 void Widget::on_startBtn2_clicked() {if(ui->startBtn2->text() == "启动"){//启动一个定时器t->start(1000); //每隔1秒发射一个timeout信号//将启动按钮设置成关闭ui->startBtn2->setText("关闭");}else{//关闭一个定时器t->stop();//将关闭按钮设置成启动ui->startBtn2->setText("启动");} } //定时器超时对应的槽函数处理 void Widget::timeOut_Slot() {QTime sys_time = QTime::currentTime(); //获取当前系统时间//把系统时间转换成字符串QString s = sys_time.toString("hh-mm-ss");//将系统时间放入标签中ui->timeLab2->setText(s);//居中显示ui->timeLab2->setAlignment(Qt::AlignCenter); }
一百一十七、键盘事件和鼠标事件
- 当程序员使用键盘或者鼠标,系统就会自动调用QWidget中的对应事件处理函数
- 键盘事件和鼠标事件的函数原型
[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event); //键盘按下事件函数 [virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event);//键盘抬起事件函数[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event);//鼠标双击事件函数 [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件函数 [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)//鼠标按下事件函数 [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)//鼠标抬起事件函数
117.1 键盘事件
- UI界面

代码示例 : - 头文件:
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QKeyEvent> //键盘事件类 #include<QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECT public:Widget(QWidget *parent = nullptr);~Widget();void keyPressEvent(QKeyEvent *event) override; //键盘按下的重写事件函数声明void keyReleaseEvent(QKeyEvent *event) override;//键盘抬起的重写事件函数声明 private:Ui::Widget *ui; }; #endif // WIDGET_H - 源文件:
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); } Widget::~Widget() {delete ui; } //重写键盘按下事件函数的实现 void Widget::keyPressEvent(QKeyEvent *event) {ui->label->setText(event->text()+":被按下");ui->label->setAlignment(Qt::AlignCenter);//判断哪个键被按下switch (event->key()){case 'W':{if(ui->label->y() < 0-ui->label->height()) //判断标签y轴是否完全出界面{ui->label->move(ui->label->x(), this->height()); //移动到界面的下面}ui->label->move(ui->label->x(), ui->label->y()-1);}} } //重写键盘抬起事件函数的实现 void Widget::keyReleaseEvent(QKeyEvent *event) {ui->label->setText(event->text()+":被抬起");ui->label->setAlignment(Qt::AlignCenter); }
117.2 鼠标事件
- 源文件:
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//窗口开启追踪功能this->setMouseTracking(true); } Widget::~Widget() {delete ui; } //重写键盘按下事件函数的实现 void Widget::keyPressEvent(QKeyEvent *event) {ui->label->setText(event->text()+":被按下");ui->label->setAlignment(Qt::AlignCenter);//判断哪个键被按下switch (event->key()){case 'W':{if(ui->label->y() < 0-ui->label->height()) //判断标签y轴是否完全出界面{ui->label->move(ui->label->x(), this->height()); //移动到界面的下面}ui->label->move(ui->label->x(), ui->label->y()-1);}} } //重写键盘抬起事件函数的实现 void Widget::keyReleaseEvent(QKeyEvent *event) {ui->label->setText(event->text()+":被抬起");ui->label->setAlignment(Qt::AlignCenter); } //鼠标按下重写事件函数的实现 void Widget::mousePressEvent(QMouseEvent *event) {if(event->button() == Qt::LeftButton){QString s = QString("左键被按下\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);}else if(event->button() == Qt::RightButton){QString s = QString("右键被按下\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);}else if(event->button() == Qt::MiddleButton){QString s = QString("中间键被按下\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);} } //鼠标移动重写事件函数的实现 void Widget::mouseMoveEvent(QMouseEvent *event) {ui->label->move(event->pos()); //跟着鼠标所在位置移动 } //鼠标抬起重写事件函数的实现 void Widget::mouseReleaseEvent(QMouseEvent *event) {if(event->button() == Qt::LeftButton){QString s = QString("左键被抬起\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);}else if(event->button() == Qt::RightButton){QString s = QString("右键被抬起\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);}else if(event->button() == Qt::MiddleButton){QString s = QString("中间键被抬起\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);} } //鼠标双击重写事件函数的实现 void Widget::mouseDoubleClickEvent(QMouseEvent *event) {if(event->button() == Qt::LeftButton){QString s = QString("左键被双击\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);}else if(event->button() == Qt::RightButton){QString s = QString("右键被双击\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);}else if(event->button() == Qt::MiddleButton){QString s = QString("中间键被双击\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());ui->label->setText(s);} }
117.3 移动窗口案例
- 加到上边的源文件中
void Widget::mousePressEvent(QMouseEvent *event) {//p = event->globalPos()-this->frameGeometry().topLeft();//鼠标点击全局位置 //窗口一开始位置p=event->pos(); } void Widget::mouseMoveEvent(QMouseEvent *event) {if(event->buttons() == Qt::LeftButton){this->move(event->globalPos()-p);//鼠标点击全局位置 鼠标相对于窗口的位置} }
一百一十八、绘制事件
- 绘制事件是qt提供的二维图形引擎,能够让用户绘制各种图形,例如:适量文字、绘制图形、图像等
- 绘制事件处理函数触发情况:窗口第一次展示、窗口最小化、最大化、窗口从覆盖状态显示出来、手动拖动窗口调大小、调用update函数
- 绘制事件,依赖于画家类(QPainter)实现相关绘制工作
示例 :
- 重写的函数
//绘制事件处理函数 void Widget::paintEvent(QPaintEvent *event) { // static int num = 0; // qDebug() << ++num;//实例化一个画家QPainter p(this); //指定绘制地方//给画家设置画笔p.setPen(QColor("pink"));//给画家的笔设置字体类型p.setFont(QFont("宋体",40,10,false));p.drawText(this->rect(),Qt::AlignCenter,"好好学习,天天向上");//区域范围 }
小作业
- 写一个闹钟

我写的
clock.h
#ifndef CLOCK_H
#define CLOCK_H#include <QWidget>
#include <QTextToSpeech>
#include <QTime>
#include <QTimer>
#include <QTimeEdit>
#include <QTimerEvent>
#include <QDate>
#include <QDateTime>
#include <QPushButton>
#include <QDebug>
#include <QMouseEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Clock; }
QT_END_NAMESPACEclass Clock : public QWidget
{Q_OBJECTpublic:Clock(QWidget *parent = nullptr);~Clock();void timerEvent(QTimerEvent *event) override;signals:void speak();private slots:void timeOut_solt();void speak_slot();void mousePressEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;private:Ui::Clock *ui;QDateTime sys_date;QTimer *sys_time,*t;int tid;QPoint p;QTextToSpeech *speecher;
};
#endif // CLOCK_H
clock.cpp
#include "clock.h"
#include "ui_clock.h"Clock::Clock(QWidget *parent): QWidget(parent), ui(new Ui::Clock)
{ui->setupUi(this);// 设置窗口为纯净模式this->setWindowFlags(Qt::FramelessWindowHint);// 直接先初始化当前时间tid = startTimer(1000);sys_time = new QTimer(this);speecher = new QTextToSpeech(this);// 初始化tt = new QTimer(this);// 连接超时信号与处理的槽函数connect(t, &QTimer::timeout, this, &Clock::timeOut_solt);
}Clock::~Clock()
{killTimer(tid);delete ui;
}void Clock::timerEvent(QTimerEvent *event)
{if(event->timerId() == tid){sys_date = QDateTime::currentDateTime();ui->nowTimeLab->setText(sys_date.toString("yyyy-MM-dd HH:mm:ss"));ui->nowTimeLab->setAlignment(Qt::AlignCenter);}
}void Clock::timeOut_solt()
{QTime the_time = QTime::currentTime();// 时间超过则直接发送语音播报信号if(the_time.toString("hh:mm:ss") >= ui->clockTimeEdit->toPlainText()){emit speak();}
}// 语音播报
void Clock::speak_slot()
{speecher->say(ui->textEdit->toPlainText());
}void Clock::mousePressEvent(QMouseEvent *event)
{p = event->pos();if(event->button() == Qt::LeftButton){// 鼠标按下位置在 关闭上if(p.x() >= ui->closeLab->x() && p.x() <= ui->closeLab->x()+ui->closeLab->width() \&& p.y() >= ui->closeLab->y() && p.y() <= ui->closeLab->y()+ui->closeLab->height()){// 按下关闭,关闭变红ui->closeLab->setStyleSheet("background-color:red");}// 鼠标按下位置在 打开上else if (p.x() >= ui->openLab->x() && p.x() <= ui->openLab->x()+ui->openLab->width() \&& p.y() >= ui->openLab->y() && p.y() <= ui->openLab->y()+ui->openLab->height()){}}
}void Clock::mouseReleaseEvent(QMouseEvent *event)
{p = event->pos();if(event->button() == Qt::LeftButton){// 鼠标松开位置在 关闭上if(p.x() >= ui->closeLab->x() && p.x() <= ui->closeLab->x()+ui->closeLab->width() \&& p.y() >= ui->closeLab->y() && p.y() <= ui->closeLab->y()+ui->closeLab->height()){// 松开关闭t->stop();ui->openLab->setStyleSheet("background-color:white");ui->openLab->setText("启动闹钟");ui->closeLab->setStyleSheet("background-color:white");disconnect(this, &Clock::speak, this, &Clock::speak_slot);}// 鼠标松开位置在 打开上else if (p.x() >= ui->openLab->x() && p.x() <= ui->openLab->x()+ui->openLab->width() \&& p.y() >= ui->openLab->y() && p.y() <= ui->openLab->y()+ui->openLab->height()){// 松开打开t->start(3000);ui->openLab->setText("已启动");ui->openLab->setStyleSheet("background-color:green");// 将语音播报信号和语音播报槽函数连接connect(this, &Clock::speak, this, &Clock::speak_slot);}}
}
main.cpp
#include "clock.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Clock w;w.show();return a.exec();
}
执行的 UI 界面

相关文章:
嵌入式养成计划-45----QT--事件机制--定时器事件--键盘事件和鼠标事件--绘制事件
一百一十五、事件机制 当这件事情发生时,会自动走对应的函数处理(重写的事件函数) 115.1 事件处理简介 什么是事件? (重点) 件是由窗口系统或者自身产生的,用以响应所发生的各类事情,比如用户按下并释放…...
git远程仓库、开发者使用流程、ssh连接
git远程仓库 https://www.cnblogs.com/liuqingzheng/p/15328319.html 远程仓库有: : github gitlab gitee 在gitee上创建了仓库 (确保仓库是空的)本地:git init本地:git commit -m 提交版本指定远程仓库地址 添加一…...
SpringBoot (3) Profiles,外部化配置,自定义starter
目录 1 Profiles 1.1 "组件"环境隔离 1.1.1 标识环境 1.1.2 激活环境 1.2 "配置"环境隔离 1.2.1 添加"副配置文件" 1.2.2 激活环境 2 外部化配置 2.1 配置优先级 2.2 快速部署 3 自定义starter 3.1 基本抽取 3.1.1 导yaml提示包 3…...
【C++】类型转换(dynamic_cast,const_cast,static_cast,reinterpret_cast)
🌏博客主页: 主页 🔖系列专栏: C ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 文章目录 C语言中的类型转换一、static_cast二、reinterpret_cast三、 const_cast四、 dynamic…...
冷笑话-1
代码检视时,程序员A看着下面的代码,疑惑地问程序员B:“为什么不用重载?” class MyClass {public MyClass queryById(long id) { //......}public MyClass queryByName(String Name) { //......}public MyClass queryByIdAndNam…...
模拟退火算法(SA)求解旅行商问题(TSP)python
目录 一、模拟退火算法求解TSP(city14)的python代码 二、city14的运行结果 三、 模拟退火算法求解TSP(city30)的python代码 四、city30的运行结果 一、模拟退火算法求解TSP(city14)的python代码 impor…...
Intelijj使用Gitee团队开发
初始化项目到Gitee服务器 成功标识: 添加团队成员 点击管理——仓库成员设置——开发者 2.添加仓库成员 (最多不超过5人) 3.通过链接或者二维码邀请新成员,或者可以自己手动添加新成员并提交 多人项目仓库创建完成 通…...
气象台使用vr模拟仿真实训教学降低成本投入
气候仿真实验室用于模拟高低温、高湿、干燥、阳光光照、降雨、降雪、覆冰、雾天与强风等多种环境适应性试验等气候和环境条件,在环境试验中,温度、湿度、光照、降雨这些常见的仿真环境都很容易实现。而比较少见的雾天、强风、降雪等环境就比较难。因此为…...
智能井盖是什么?万宾科技智能井盖传感器有什么特点
智能井盖是一种基于物联网和人工智能技术的新型城市设施。它不仅具备传统井盖的功能,还能通过数字化、自动化的方式实现远程监控和智能管理,提升城市运行效率和服务水平。 WITBEE万宾智能井盖传感器EN100-C2是一款井盖异动监测的传感终端。对窨井盖状态(…...
使用 类加载器 或者 类对象 读取文件
相对路径:项目 的 根目录 开始查找。( 但是在我们真正开发的时候,我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面,而是放在我们模块里面 )同理可得,我们直接创建 文件 b.txt 会在项目的根目…...
《深度学习推荐系统》王喆 笔记
这个笔记,是我记录的阅读该书,对我比较有用的一些点。不算是能完全覆盖全书知识点的笔记。 能完全覆盖全书知识点,比较详尽的笔记,可以参考如下。 《深度学习推荐系统》超级详细读书笔记https://www.zhihu.com/tardis/bd/art/44…...
微软Azure OpenAI支持数据微调啦!可打造专属ChatGPT
10月17日,微软在官网宣布,现在可以在Azure OpenAI公共预览版中对GPT-3.5-Turbo、Babbage-002 和Davinci-002模型进行数据微调。 使得开发人员通过自己的数据集,便能打造独一无二的ChatGPT。例如,通过海量医疗数据进行微调&#x…...
Kali Linux 安装搭建 hadoop 平台 详细教程
1)前期环境准备:(虚拟机、jdk、ssh) 2)SSH相关配置 安装SSH Server服务器:apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…...
leetcode做题笔记190. 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因…...
JAVA如何获取服务器ip
一、最简单的方法就是使用InetAddress获取本机ip InetAddress.getLocalHost().getHostAddress(); public static void main(String[] args) {try {//用 getLocalHost() 方法创建的InetAddress的对象InetAddress address InetAddress.getLocalHost();System.out.println(addr…...
Power BI 傻瓜入门 4. Power BI:亮点
本章内容包含: 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样,Power BI要求其用户熟悉商业智能(BI)解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…...
网络参考资料搬运(3)
(1) Python: 使用Python打开新的终端(terminal)并执行语句 通过Python 打开各系统(MAC, LINUX, WINDOWS)下的终端 (Terminal) python执行shell脚本的几种方法 自己写Linux命令 用Python写个Linux系统命令 Python 使用sftp传输文件…...
Bias in Emotion Recognition with ChatGPT
本文是LLM系列文章,针对《Bias in Emotion Recognition with ChatGPT》的翻译。 chatGPT在情绪识别中的偏差 摘要1 引言2 方法3 结果4 讨论5 结论 摘要 本技术报告探讨了ChatGPT从文本中识别情绪的能力,这可以作为交互式聊天机器人、数据注释和心理健康…...
【PACS系统源码】与医院HIS系统双向数据交换,实现医学影像集成与影像后处理功能
医院医学影像PACS系统源码,集成三维影像后处理功能,包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大,代码完整。 PACS系统与医院HIS实现双向数据交换,…...
深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU、GELU等。
深度学习中常用的激活函数 1. Sigmoid函数2. Tanh函数3. ReLU函数4. LeakyReLU函数5. PReLU函数6. ELU函数:7. GELU函数: 深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU等。 1. Sigmoid函数 Sigmoid函数公式为 f ( x ) 1 1 e −…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
