QT学习笔记-QT5.15编译及安装谷歌拼音输入法(QtInputMethod_GooglePinyin)
QT学习笔记-QT5.15编译及安装谷歌拼音输入法(QtInputMethod_GooglePinyin)
- 0、背景
- 1、环境
- 2、下载QtInputMethod_GooglePinyin源码
- 3、使用MinGW64构建套件编译
- 3.1 编译QtInputMethod_GooglePinyin源码
- 3.2、部署tgtsmlInputContextPlugin输入法插件
- 3.3、运行测试程序
- 4、使用MSVC2019_64构建套件编译
- 4.1 编译QtInputMethod_GooglePinyin源码
- 4.2、部署tgtsmlInputContextPlugin输入法插件
- 4.3、运行测试程序,与步骤3.3相同。
- 5、修改QtInputMethod_GooglePinyin源码解决在分屏情况下虚拟键盘显示越界及不能跨屏显示的问题
- 6、修改QtInputMethod_GooglePinyin源码解决在Linux Arm环境下部分应用资源冲突导致无法加载qss和ota字体的问题
- 7、完整源码下载
0、背景
在使用QT进行嵌入式应用开发时,往往程序最终的运行设备是有触屏的设备。因此,不可避免的会遇到虚拟键盘和中文输入的问题。QT自带一个虚拟键盘,可以在构建套件/plugins/platforminputcontexts目录下看到2个文件:
- qtvirtualkeyboardplugin.dll
- qtvirtualkeyboardplugin.dll.debug
QT自带的虚拟键盘屏幕占比较大,而且很容易挡住输入框,默认不能拖动,不太完美。本就介绍一种替代方式,就是在QT程序中使用GooglePinyin输入法实现虚拟键盘和中文录入。
1、环境
操作系统:windows10专业版
QT版本:5.15.2
QT安装目录:D:\Qt
QT编译套件1:MinGW64
QT编译套件2:MSVC2019_64
2、下载QtInputMethod_GooglePinyin源码
1、下载地址:
https://gitee.com/tgtsml/QtInputMethod_GooglePinyin

2、下载后可以看到压缩包如下图:

3、解压缩后如下图:
4、文件夹的内容如下:

3、使用MinGW64构建套件编译
3.1 编译QtInputMethod_GooglePinyin源码
1、通过qtcreator打开tgtsmlInputContextPlugin.pro工程,本例采用的MinGW64构建套件。如下图:

2、然后分别以debug模式和release模式对tgtsmlInputContextPlugin进行重新构建,会在tgtsmlInputContextPlugin.pro同级目录下生成一个build目录,如下图:

3.2、部署tgtsmlInputContextPlugin输入法插件
1、把上一步编译生成的build/bin/platforminputcontexts目录下的
- tgtsmlInputContextPlugin.dll
- tgtsmlInputContextPlugind.dll
如下图:

复制到D:\Qt\5.15.2\mingw81_64\plugins\platforminputcontexts目录下。
3.3、运行测试程序
1、可以看到下载的源码中包括一个测试程序demo,关键引入输入法虚拟键盘的代码如下:
qputenv("QT_IM_MODULE", QByteArray("tgtsml"));
如下图:

这样当光标聚焦在输入文本框时,会自动弹出虚拟键盘。
运行效果如下:

4、使用MSVC2019_64构建套件编译
4.1 编译QtInputMethod_GooglePinyin源码
1、在项目选项卡中对当前项目的构建套件切换至MSVC2019_64构建套件上,然后对项目进行重新构建,然后这时出现了很多错误,如下图:

2、解决这些问题需要做2个方面的修改。
2.2.1 第1是把所有pro的换行符由Unix(LF)改为Windows(CRLF)
如下,原来是这样:

改成下面这样:

2.2.2 第2是在demo.pro、googlepinyin.pro、plugin.pro 3个文件中增加中文处理的配置,如下:
# 解决msvc构建套件下qtcreator控制台日志中文乱码问题
msvc {QMAKE_CFLAGS += /utf-8QMAKE_CXXFLAGS += /utf-8
}
如下图所示:



3、然后再重新构建,就能正常编译过去了。同样使用debug模式和release模式编译完毕后会在会在tgtsmlInputContextPlugin.pro同级目录下生成一个build目录,如果之前在MinGW64构建套件下已生成了,建议先删除,或者在pro文件中指定使用不同构建套件时生成的库放到不同位置,如下:
# 指定输出目录
!msvc {DESTDIR = ../../wongoing_plugin_bin
}
msvc {DESTDIR = ../../wongoing_plugin_bin_msvc
}
4.2、部署tgtsmlInputContextPlugin输入法插件
1、把上一步编译生成的build/bin/platforminputcontexts目录下的
- tgtsmlInputContextPlugin.dll
- tgtsmlInputContextPlugind.dll
- tgtsmlInputContextPlugind.pdb
如下图:

复制到D:\Qt\5.15.2\msvc2019_64\plugins\platforminputcontexts目录下。
4.3、运行测试程序,与步骤3.3相同。
5、修改QtInputMethod_GooglePinyin源码解决在分屏情况下虚拟键盘显示越界及不能跨屏显示的问题
1、当我的笔记本电脑有外接了一个显示时(扩展模式)使用时会出现2个问题,第1个问题是虚拟键盘不能显示到扩展屏幕上,虽然我的demo窗口显示在扩展屏幕。第2个问题,就是当demo窗口(输入框窗口)在主屏幕最右测时,虚拟键盘会有一部分显示不出来,就是显示越界。具体如下图:

上图是虚拟键盘不能跨屏幕显示,只能显示在主屏上。

上图是右侧显示不完整的情况。
2、修改plugin项目中的tgtsmlplatforminputcontext.cpp文件中的void TgtsmlPlatformInputContext::showInputPanel()中的代码,如下:
void TgtsmlPlatformInputContext::showInputPanel()
{if(!m_keyboard){m_keyboard = new KeyboardForm;connect(m_keyboard, &KeyboardForm::sendKeyToFocusItem, this, &TgtsmlPlatformInputContext::sendKeyToFocusItem);}if(m_keyboard->isHidden())m_keyboard->show();QWidget *widgetTmp = qobject_cast<QWidget*>(m_focusitem);if(widgetTmp){ //注释以下代码,因为没有考虑扩展屏幕的坐标问题
// QPoint widgetGlobalPos = widgetTmp->mapToGlobal(QPoint(0, 0));
// if(widgetGlobalPos.x() < 0){
// widgetGlobalPos.setX(0);
// }
// if(widgetGlobalPos.y() < 0){
// widgetGlobalPos.setY(0);
// }
// if(qApp->desktop()->width() - widgetGlobalPos.x() < m_keyboard->width()){
// widgetGlobalPos.setX(qApp->desktop()->width() - m_keyboard->width());
// }
// if(qApp->desktop()->height() - widgetGlobalPos.y() - 30 < m_keyboard->height()){
// widgetGlobalPos.setY(widgetGlobalPos.y() - m_keyboard->height() - 10);
// }
// else{
// widgetGlobalPos = widgetGlobalPos + QPoint(0,30);
// }
// m_keyboard->move(widgetGlobalPos);//改为以下代码,增加考虑扩展屏幕的代码//获取当前屏幕及屏幕几何矩形坐标int currentScreen = qApp->desktop()->screenNumber(widgetTmp);if (currentScreen < 0){currentScreen = 0;}QScreen *screen = QGuiApplication::screens().at(currentScreen);QRect rect = screen->geometry();QPoint widgetGlobalPos = widgetTmp->mapToGlobal(QPoint(0, 0));if(widgetGlobalPos.x() < rect.x()) {widgetGlobalPos.setX(rect.x());}if (widgetGlobalPos.y() < rect.y()){widgetGlobalPos.setY(rect.y());}if(rect.width() - widgetGlobalPos.x() < m_keyboard->width()) {widgetGlobalPos.setX(rect.width() - m_keyboard->width());}if(rect.height() - widgetGlobalPos.y() - 30 < m_keyboard->height()) {widgetGlobalPos.setY(widgetGlobalPos.y() - m_keyboard->height() - 10);}else {widgetGlobalPos = widgetGlobalPos + QPoint(0,30);}m_keyboard->move(widgetGlobalPos);}
}
3、修改后重新编译、重新部署,再运行demo程序就正常了。
6、修改QtInputMethod_GooglePinyin源码解决在Linux Arm环境下部分应用资源冲突导致无法加载qss和ota字体的问题
1、当在嵌入式Linu Arm环境中使用GooglePinyin虚拟键盘时,如果某个Qt应用使用了资源文件可能会导致GooglePinyin虚拟键盘无法加载:/res/stylesheet.qss和:res/FontAwesome.otf从而无法显示虚拟键盘进而导致程序崩溃。

2、要解决这个问题,需要修改plugin项目中的keyboardform.cpp文件中的KeyboardForm::KeyboardForm(QWidget *parent)
: QWidget(parent)中的代码,如下:
KeyboardForm::KeyboardForm(QWidget *parent): QWidget(parent)
{character_btns_list.clear();current_mode = InputMode::en;upper_mode = false;m_symbol_page = 0;this->setFixedSize(800,250);int keyboard_btn_width = this->width()/11.5;int keyboard_btn_height = this->height()/5.0;//设置主窗体样式this->setAttribute(Qt::WA_TranslucentBackground);this->setWindowFlags(Qt::Tool | \Qt::FramelessWindowHint | \Qt::WindowStaysOnTopHint | \Qt::WindowDoesNotAcceptFocus);//加载QSS样式表
// QFile qss(":/res/stylesheet.qss");
// if(false == qss.open(QFile::ReadOnly))return;
// this->setStyleSheet(qss.readAll());
// qss.close();//以上代码在窗体及容器控件的多层嵌套情况下会导致qss样式资源无法加载,改为以下代码QFile qss(":/res/stylesheet.qss");if (qss.exists() && qss.open(QFile::ReadOnly)){this->setStyleSheet(qss.readAll());qss.close();}else{QString strcss = "" \"QWidget{background-color:black;}" \"QPushButton{font:25px;background-color:gray;color:white;border:2px solid black;border-radius:10px;}" \"QPushButton#function_button{background-color:rgb(80,80,80);color:rgb(200,200,200);font:20px;}" \"QPushButton:hover{background-color:green;color:white;}" \"QPushButton:pressed,QPushButton#function_button::pressed{background-color:red;color:white;}" \"QPushButton#function_button:checked{background-color:rgb(200,100,50);color:yellow;}" \"QPushButton#hanzichangepage,QPushButton#hanzicandidates{background-color:transparent;color:white;}" \"QPushButton#hanzichangepage:pressed{color:red;}" \"QPushButton#hanzichangepage:disabled{color:gray;}" \"QPushButton#emoji{background-color:rgb(80,80,80);color:yellow;}" \"QPushButton#emoji:hover{color:red;}" \"QPushButton#emoji:pressed{color:blue;}" \"QLabel{background-color:rgba(255,255,255,80);border-radius:2px;color:white;font:15px;margin-left: 5px;}";this->setStyleSheet(strcss);}//图标字体
// int fontId = QFontDatabase::addApplicationFont(":/res/FontAwesome.otf");
// QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);
// QFont btnicofont(fontName);
// btnicofont.setPixelSize(10);//以上代码在窗体及容器控件的多层嵌套情况下会导致字体资源无法加载,改为以下方式QFont btnicofont(QString("Arial"));btnicofont.setPixelSize(10);if (QFile::exists(":res/FontAwesome.otf")){int fontId = QFontDatabase::addApplicationFont(":/res/FontAwesome.otf");QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);btnicofont.setFamily(fontName);}
#ifdef Q_OS_LINUXelse if (QFile::exists("/usr/share/font-awesome/fonts/FontAwesome.otf")){int fontId = QFontDatabase::addApplicationFont("/usr/share/font-awesome/fonts/FontAwesome.otf");QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);btnicofont.setFamily(fontName);}
#endifelse{qWarning() << "can not find FontAwesome.otf";}//单行布局QHBoxLayout *hb[6];for(int i=0; i<6; i++){hb[i] = new QHBoxLayout();hb[i]->setMargin(0);i == 1 ? hb[i]->setSpacing(2) : hb[i]->setSpacing(0);}widget_pinyin = new QWidget(this);widget_pinyin->setFixedHeight(keyboard_btn_height);//拼音缓存m_label_pinyin = new QLabel(this);m_label_pinyin->setFixedHeight(keyboard_btn_height*0.4);hb[0]->addWidget(m_label_pinyin);hb[0]->addStretch(1);//汉子缓存for(int i=0; i<chinesecharacters_number; i++){QPushButton *btn = new QPushButton(this);btn->setFixedHeight(keyboard_btn_height*0.6);hb[1]->addWidget(btn);if(i != chinesecharacters_number - 1) hb[1]->addStretch(1);if (i == 0 || i == chinesecharacters_number-1){change_chinese_characters_page_list.append(btn);btn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);btn->setFont(btnicofont);btn->setText(i == 0 ? QString(QChar(0xf0d9)) : QString(QChar(0xf0da)));btn->setObjectName("hanzichangepage");i == 0 ? \connect(btn, &QPushButton::clicked, this, &KeyboardForm::chineseCharactersUpdatePrevious) :connect(btn, &QPushButton::clicked, this, &KeyboardForm::chineseCharactersUpdateNext);}else{chinese_characters_list.append(btn);btn->setObjectName("hanzicandidates");connect(btn, &QPushButton::clicked, this, &KeyboardForm::chineseCharactersSelected);}}QVBoxLayout *vb_pinyin = new QVBoxLayout(widget_pinyin);vb_pinyin->addLayout(hb[0]);vb_pinyin->addLayout(hb[1]);vb_pinyin->setMargin(0);vb_pinyin->setSpacing(0);widget_keyboard = new QWidget(this);widget_keyboard->setFixedHeight(keyboard_btn_height*4.0);//键盘for(int i=0; i<29; i++){QPushButton *btn = new QPushButton(QChar(keyboard_characters[i]),this);btn->setFixedSize(keyboard_btn_width, keyboard_btn_height);character_btns_list.append(btn);connect(btn, &QPushButton::clicked, this, &KeyboardForm::characterButtonClicked);}//第一排字母:0-9for(int i=0; i<10; i++){hb[2]->addWidget(character_btns_list.at(i));}QPushButton *btn_backspace = new QPushButton(QChar(0xf060));btn_backspace->setFont(btnicofont);btn_backspace->setFixedSize(keyboard_btn_width*1.5, keyboard_btn_height);btn_backspace->setObjectName("function_button");hb[2]->addWidget(btn_backspace);connect(btn_backspace, &QPushButton::clicked, this, &KeyboardForm::btnBackspaceClicked);//第二排字母:10-18hb[3]->addStretch(1);for(int i=10; i<19; i++){hb[3]->addWidget(character_btns_list.at(i));}QPushButton *btn_enter = new QPushButton("Enter");btn_enter->setFixedSize(keyboard_btn_width*1.5, keyboard_btn_height);btn_enter->setObjectName("function_button");hb[3]->addWidget(btn_enter);hb[3]->addStretch(1);connect(btn_enter, &QPushButton::clicked, this, &KeyboardForm::btnEnterClicked);//第三排字母:20-26QPushButton *btn_upper = new QPushButton(QChar(0xf062));btn_upper->setFixedSize(keyboard_btn_width*1.5, keyboard_btn_height);btn_upper->setFont(btnicofont);btn_upper->setObjectName("function_button");hb[4]->addWidget(btn_upper);connect(btn_upper, &QPushButton::clicked, this, &KeyboardForm::btnUpperClicked);for(int i=19; i<29; i++){hb[4]->addWidget(character_btns_list.at(i));}character_btns_list.append(btn_upper);//第四排功能键QPushButton *btn_symbols = new QPushButton(".?123");btn_symbols->setFixedSize(keyboard_btn_width*1.5, keyboard_btn_height);btn_symbols->setObjectName("function_button");hb[5]->addWidget(btn_symbols);connect(btn_symbols, &QPushButton::clicked, this, &KeyboardForm::btnSymbolsClicked);QPushButton *btn_language = new QPushButton(QChar(0xf0ac));btn_language->setFixedSize(keyboard_btn_width, keyboard_btn_height);btn_language->setFont(btnicofont);btn_language->setObjectName("function_button");hb[5]->addWidget(btn_language);connect(btn_language, &QPushButton::clicked, this, &KeyboardForm::btnLanguageClicked);QPushButton *btn_blankspace = new QPushButton("English");btn_blankspace->setFixedHeight(keyboard_btn_height);hb[5]->addWidget(btn_blankspace);character_btns_list.append(btn_blankspace);connect(btn_blankspace, &QPushButton::clicked, this, &KeyboardForm::btnBlankspaceClicked);QPushButton *btn_emoji = new QPushButton(QChar(0xf118));btn_emoji->setFixedSize(keyboard_btn_width, keyboard_btn_height);btn_emoji->setFont(btnicofont);btn_emoji->setObjectName("emoji");hb[5]->addWidget(btn_emoji);connect(btn_emoji, &QPushButton::clicked, this, &KeyboardForm::btnEmojiClicked);QPushButton *btn_hidekeyboard = new QPushButton(QString(QChar(0xf11c)).append(QChar(0xf103)));btn_hidekeyboard->setFixedSize(keyboard_btn_width*1.5, keyboard_btn_height);btn_hidekeyboard->setFont(btnicofont);btn_hidekeyboard->setObjectName("function_button");hb[5]->addWidget(btn_hidekeyboard);connect(btn_hidekeyboard, &QPushButton::clicked, this, &KeyboardForm::hideKeyboard);QVBoxLayout *vb_keyboard = new QVBoxLayout(widget_keyboard);vb_keyboard->setMargin(0);vb_keyboard->setSpacing(0);for(int i=2; i<6; i++){vb_keyboard->addLayout(hb[i]);}QVBoxLayout *vb_system = new QVBoxLayout(this);vb_system->setMargin(0);vb_system->setSpacing(0);vb_system->addStretch(1);vb_system->addWidget(widget_pinyin);vb_system->addWidget(widget_keyboard);widget_pinyin->hide();updateButtonStateOfChineseCharacters();
}
7、完整源码下载
修改后的完整源码下载地址
相关文章:
QT学习笔记-QT5.15编译及安装谷歌拼音输入法(QtInputMethod_GooglePinyin)
QT学习笔记-QT5.15编译及安装谷歌拼音输入法(QtInputMethod_GooglePinyin) 0、背景1、环境2、下载QtInputMethod_GooglePinyin源码3、使用MinGW64构建套件编译3.1 编译QtInputMethod_GooglePinyin源码3.2、部署tgtsmlInputContextPlugin输入法插件3.3、运…...
python 使用 pdf2image 库将PDF转换为图片
在 Ubuntu 上实现网络穿透:手把手教你搭建FRPS服务器 初环境步骤一:安装pdf2image库步骤二:导入必要的库步骤三:指定PDF文件路径步骤四:将PDF转换为图片步骤五:保存图像为图片文件完整代码运行结果 在数字化…...
kubernetes(namespace、pod、deployment、service、ingress)
NameSpace NameSpace名称空间 用来隔离资源,但是不隔离网络 使用命令行: kubectl create ns hello #创建 kubectl delete ns hello #删除 kubectl get ns #查看使用配置文件: vi hello.yamlapiVersion: v1 kind: Namespace metadata:name…...
深度学习loss变为nan的问题
在网上查了一些资料,但是这个情况和网上都不太一样。前100epoch能正常训练,loss缓慢下降,精度缓慢增大,但是突然loss就Nan了,我想应该不是样本问题也不是梯度爆炸或者loss中有除0吧,毕竟都训练了100epoch了…...
音视频 ffplay命令-主要选项
选项说明-x width强制显示宽带-y height强制显示高度-video_size size帧尺寸 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频-pixel_format format格式设置像素格式-fs以全屏模式启动-an禁用音频(不播放声音)-vn禁…...
深入浅出Pytorch函数——torch.nn.init.dirac_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
[Go版]算法通关村第十三关青铜——数字数学问题之统计问题、溢出问题、进制问题
这里写自定义目录标题 数字统计专题题目:数组元素积的符号思路分析:无需真计算,只需判断负数个数是奇是偶复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 题目:阶乘尾数0的个数思路分析&am…...
GPT-4一纸重洗:从97.6%降至2.4%的巨大挑战
斯坦福大学和加州大学伯克利分校合作进行的一项 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明,随着时间的推移,GPT-4 的响应能力非但没有提高,反而随着语言模型的进一步更新而变得更糟糕。 研究小组评估了 2023 年 3 月和 20…...
大数据Flink学习圣经:一本书实现大数据Flink自由
学习目标:三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本,是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下:《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来, 已经汇集了 好几百题,大量的大厂面试…...
什么是微服务?
2.微服务的优缺点 优点 单一职责原则每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求;开发简单,开发效率提高,一个服务可能就是专一的只干一件事;微服务能够被小…...
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)
阅读导航 前言stack1. stack概念2. stack特点3. stack使用 queue1. queue概念2. queue特点3. queue使用 容器适配器1. 什么是适配器2. STL标准库中stack和queue的底层结构3. STL标准库中对于stack和queue的模拟实现⭕stack的模拟实现⭕stack的模拟实现 总结温馨提示 前言 文章…...
系统架构设计专业技能 · 软件工程之需求工程
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...
2023国赛数学建模E题思路模型代码 高教社杯
本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…...
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C++)
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C) Baumer工业相机Baumer工业相机的Bufferlist序列功能的技术背景CameraExplorer如何查看相机Bufferlist功能在BGAPI SDK里通过函数设置相机Bufferlist参数 Baumer工业相机通过BGAP…...
从 Ansible Galaxy 使用角色
从 Ansible Galaxy 使用角色 根据下列要求,创建一个名为 /home/curtis/ansible/roles.yml 的 playbook : playbook 中包含一个 play, 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。 此角色配置一项服务,以…...
ROS与STM32通信(二)-pyserial
文章目录 下位机上位机自定义msg消息发布订阅 ROS与STM32通信一般分为两种, STM32上运行ros节点实现通信使用普通的串口库进行通信,然后以话题方式发布 第一种方式具体实现过程可参考上篇文章ROS与STM32通信-rosserial,上述文章中的收发频率…...
[oneAPI] 使用Bert进行中文文本分类
[oneAPI] 使用Bert进行中文文本分类 Intel Optimization for PyTorch基于BERT的文本分类模型数据预处理数据集定义tokenize建立词表转换为Token序列padding处理与mask 模型 结果OneAPI参考资料 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517…...
【数据治理】什么是数据库归档
文章目录 前言什么是数据归档 前言 如果您的日常工作中需要对数据库进行管理,那您肯定已经或即将遭遇这样的困惑:随着业务的蓬勃发展,数据库文件的大小逐渐增大,您需要为在线业务提供越来越大的高性能磁盘容量,但数据…...
AI代码补全 案例 - 阿里云智能编码插件Cosy
文章目录 Cosy简介Cosy安装Marketplace安装【推荐】离线安装安装效果Cosy功能体验代码智能补全代码示例搜索API搜索自然语言搜索控制台异常搜索优质文档搜索Cosy体验有感参考Cosy简介 阿里云智能编码插件(Alibaba Cloud AI Coding Assistant)是一款AI编程助手,提供代码智能…...
【Linux】进程信号篇Ⅰ:信号的产生(signal、kill、raise、abort、alarm)、信号的保存(core dump)
文章目录 一、 signal 函数:用户自定义捕捉信号二、信号的产生1. 通过中断按键产生信号2. 调用系统函数向进程发信号2.1 kill 函数:给任意进程发送任意信号2.2 raise 函数:给调用进程发送任意信号2.3 abort 函数:给调用进程发送 6…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
