QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样
QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样
- [1] QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样
- 一、本自制虚拟键盘特点
- 二、windows打开系统自带软键盘
- 三、让键盘界面保持在最上方、不改变底层界面焦点
- 四、长按按键重复输入键盘内容
- 五、模拟键盘点击事件完成虚拟键盘输入
- 六、键盘符号输入
- 七、界面
- 八、头文件代码
- 九、源文件代码
[1] QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样
原文链接:https://blog.csdn.net/qq_41632571/article/details/125808787
一、本自制虚拟键盘特点
1.键盘界面保持在所有界面最上方。
2.点击键盘按钮不会改变底层文本输入框焦点。
3.通过模拟键盘点击事件完成键盘输入文本信息。
4.包含各种键盘自带符号输入。
5.长按按键可以持续重复输入键盘内容。
6.支持win7、win10、Linux等各个系统。
7.界面好看。
总之跟真的虚拟键盘一样,不会有不爽的地方
二、windows打开系统自带软键盘
QDesktopServices::openUrl(QUrl("osk.exe", QUrl::TolerantMode));
传统打开系统自带虚拟键盘的方法如上,一行代码即可,但是系统自带的虚拟键盘不一定好用,有的按键太小,有的电脑上可能没有自带的软键盘,干脆直接写一个。
三、让键盘界面保持在最上方、不改变底层界面焦点
很多自制键盘时不知道怎么使键盘保持在最顶层,发现点击键盘界面后系统焦点在键盘界面上了,光标不在底层的行输入框里,就通过输入完成后点击确定的方式将键盘内容传到底层界面,显得不nice,其实这两个问题都很简单能够解决,代码如下
this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus);
Qt::WindowStaysOnTopHint 设置窗口置顶
Qt::WindowDoesNotAcceptFocus 设置无焦点窗口
四、长按按键重复输入键盘内容
特别是我们点击退格删除键时,文本比较多是我们使用真实键盘就会长按退格键把十多个文本挨个删除,而使用虚拟键盘时要按十多次退格键,显得不nice。那么我们使用QPushButton的setAutoRepeat为true,就可以实现按键长按功能了,设置重复操作延时为500ms差不多了,按下的时长超过500ms后马上再次执行按键槽函数。
pbtn->setAutoRepeat(true); //允许自动重复
pbtn->setAutoRepeatDelay(500);//设置重复操作的时延
五、模拟键盘点击事件完成虚拟键盘输入
一些自制虚拟键盘完成键盘输入的方式是同传递文本到输入框的方式,话不多说,就是不nice。点击虚拟按键直接发送对应的按键点击事件就很nice,这样其实就不会太死,甚至中文输入也可以,我们写的是键盘,不是写中文输入法,那些下载网上含有中文输入法的库的大可不必,输入法你系统用的什么就是什么。如果你想中文输入,系统下载的有搜狗输入法,你的键盘只需按下ctrl+shift切换输入法即可,而不是在键盘里实现中文输入法的功能。那样不nice,模拟发送按键点击事件代码如下。
QPushButton* pbtn = (QPushButton*)sender();if (pbtn->text() >= 'a' && pbtn->text() <= 'z') {QKeyEvent keyPress(QEvent::KeyPress, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());QKeyEvent keyRelease(QEvent::KeyRelease, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}
通过QApplication::sendEvent发送一个按键按下和按键松开的事件就相当于模拟一个按键按下事件
QKeyEvent说明:
QKeyEvent::QKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text = QString(), bool autorep = false, ushort count = 1)
类型参数必须为QEvent::KeyPress、QEvent::KeyRelease或QEvent::ShortcutOverride。
Int key是事件循环应该监听的Qt:: key的代码。 如果key为0,则事件不是已知键的结果; 例如,它可能是组合序列或键盘宏的结果。 修饰符包含键盘修饰符,给定的文本是键生成的Unicode文本。 如果autorep为真,isAutoRepeat()将为真。 Count是事件中涉及的键的数量。
QKeyEvent在我们这里用4个参数就行了,第二个参数Qt:: key对应的按键,第四个参数是需要发送的文本,没有这个参数是无法输入任何内容的。
QApplication::sendEvent的第一个参数非常重要,是接收键盘输入的控件,比如是底层界面的lineEdit。
六、键盘符号输入
m_mapSymbolKeys.insert("~", Qt::Key_AsciiTilde);m_mapSymbolKeys.insert("`", Qt::Key_nobreakspace); m_mapSymbolKeys.insert("-", Qt::Key_Minus);m_mapSymbolKeys.insert("_", Qt::Key_Underscore);m_mapSymbolKeys.insert("+", Qt::Key_Plus);m_mapSymbolKeys.insert("=", Qt::Key_Equal);m_mapSymbolKeys.insert(",", Qt::Key_Comma);m_mapSymbolKeys.insert(".", Qt::Key_Period);m_mapSymbolKeys.insert("/", Qt::Key_Slash);m_mapSymbolKeys.insert("<", Qt::Key_Less);m_mapSymbolKeys.insert(">", Qt::Key_Greater);m_mapSymbolKeys.insert("?", Qt::Key_Question);m_mapSymbolKeys.insert("[", Qt::Key_BracketLeft);m_mapSymbolKeys.insert("]", Qt::Key_BracketRight);m_mapSymbolKeys.insert("{", Qt::Key_BraceLeft);m_mapSymbolKeys.insert("}", Qt::Key_BraceRight); m_mapSymbolKeys.insert("|", Qt::Key_Bar);m_mapSymbolKeys.insert("\\", Qt::Key_Backslash);m_mapSymbolKeys.insert(":", Qt::Key_Colon);m_mapSymbolKeys.insert(";", Qt::Key_Semicolon);m_mapSymbolKeys.insert("\"", Qt::Key_QuoteLeft);m_mapSymbolKeys.insert("'", Qt::Key_Apostrophe);QKeyEvent keyPress(QEvent::KeyPress, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);QKeyEvent keyRelease(QEvent::KeyRelease, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
键盘输入特定的符号重要是找到QKeyEvent第二个参数对应的按键值即可。按键中的值被都在qnamespace.h的头文件中的enum Key枚举类型内。
七、界面
八、头文件代码
#pragma once
#pragma execution_character_set("utf-8")
#include <QDialog>
#include "ui_frmKeyBoard.h"
#include "moveWidget.h"
#include <QPushButton>
#include <QKeyEvent>
#include <QDebug>
#include <QStyle>class frmKeyBoard : public QDialog
{Q_OBJECTpublic:frmKeyBoard(QWidget *parent = nullptr);~frmKeyBoard();void initFocusWidget(QWidget*);private slots:void slotKeyButtonClicked();void slotKeyLetterButtonClicked();void slotKeyNumberButtonClicked();private:Ui::frmKeyBoardClass ui;void initFrm();void initStyleSheet();QWidget* m_focusWidget; //键盘输入主窗口QVector<QPushButton*> m_letterKeys;QVector<QPushButton*> m_NumberKeys;QMap<QString, Qt::Key> m_mapSymbolKeys;};
九、源文件代码
#include "frmKeyBoard.h"frmKeyBoard::frmKeyBoard(QWidget *parent): QDialog(parent)
{ui.setupUi(this);this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus);this->setWindowTitle("屏幕键盘");this->setWindowModality(Qt::WindowModal); this->setAttribute(Qt::WA_DeleteOnClose);MoveWidget* moveWidget = new MoveWidget();moveWidget->setWidget(this);this->initFrm();this->initStyleSheet();
}frmKeyBoard::~frmKeyBoard()
{
}void frmKeyBoard::initFocusWidget(QWidget* widget)
{m_focusWidget = widget;
}void frmKeyBoard::initFrm()
{ui.pushButton_closeKeyboard->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));m_letterKeys.clear();m_NumberKeys.clear();QList<QPushButton*> pbtns = this->findChildren<QPushButton*>();foreach(QPushButton * pbtn, pbtns) {pbtn->setAutoRepeat(true); //允许自动重复pbtn->setAutoRepeatDelay(500);//设置重复操作的时延if (pbtn->text() >= 'a' && pbtn->text() <= 'z') {connect(pbtn, &QPushButton::clicked, this, &frmKeyBoard::slotKeyLetterButtonClicked);m_letterKeys.push_back(pbtn);}else if (pbtn->text().toInt() > 0 && pbtn->text().toInt() <= 9 || pbtn->text() == "0") {connect(pbtn, &QPushButton::clicked, this, &frmKeyBoard::slotKeyNumberButtonClicked);m_NumberKeys.push_back(pbtn);}else{connect(pbtn, &QPushButton::clicked, this, &frmKeyBoard::slotKeyButtonClicked);}}m_mapSymbolKeys.insert("~", Qt::Key_AsciiTilde);m_mapSymbolKeys.insert("`", Qt::Key_nobreakspace); m_mapSymbolKeys.insert("-", Qt::Key_Minus);m_mapSymbolKeys.insert("_", Qt::Key_Underscore);m_mapSymbolKeys.insert("+", Qt::Key_Plus);m_mapSymbolKeys.insert("=", Qt::Key_Equal);m_mapSymbolKeys.insert(",", Qt::Key_Comma);m_mapSymbolKeys.insert(".", Qt::Key_Period);m_mapSymbolKeys.insert("/", Qt::Key_Slash);m_mapSymbolKeys.insert("<", Qt::Key_Less);m_mapSymbolKeys.insert(">", Qt::Key_Greater);m_mapSymbolKeys.insert("?", Qt::Key_Question);m_mapSymbolKeys.insert("[", Qt::Key_BracketLeft);m_mapSymbolKeys.insert("]", Qt::Key_BracketRight);m_mapSymbolKeys.insert("{", Qt::Key_BraceLeft);m_mapSymbolKeys.insert("}", Qt::Key_BraceRight); m_mapSymbolKeys.insert("|", Qt::Key_Bar);m_mapSymbolKeys.insert("\\", Qt::Key_Backslash);m_mapSymbolKeys.insert(":", Qt::Key_Colon);m_mapSymbolKeys.insert(";", Qt::Key_Semicolon);m_mapSymbolKeys.insert("\"", Qt::Key_QuoteLeft);m_mapSymbolKeys.insert("'", Qt::Key_Apostrophe);
}void frmKeyBoard::initStyleSheet()
{QString qss;qss += "QWidget{ background-color:rgb(26,26,26)}";qss += "QPushButton{ color:white; background-color:rgb(51,51,51); height:60px; font-size:bold 15pt; border:1px solid rgb(26,26,26); border-radius: 0px; min-width:50px;}";qss += "QPushButton:hover{background-color:rgb(229,229,229); color:black;}";qss += "QPushButton:pressed,QPushButton:checked{background-color:rgb(0,118,215);}";qss += "#pushButton_closeKeyboard{background-color:rgba(0,0,0,0); border:0px}";qss += "#pushButton_closeKeyboard:hover{background-color:#b30220;}";qss += "#pushButton_space{min-width:500px;}";qss += "#pushButton_backspace,#pushButton_shift{min-width:100px;}";qss += "#pushButton_enter{min-width:120px;}";qss += "#pushButton_tab,#pushButton_ctrl{min-width:70px;}";qss += "#pushButton_capsLock{min-width:80px;}";qss += "#pushButton_up{min-width:150px;}";this->setStyleSheet(qss);
}void frmKeyBoard::slotKeyButtonClicked()
{QPushButton* pbtn = (QPushButton*)sender();QString objectName = pbtn->objectName();if (objectName == "pushButton_closeKeyboard") {this->close();return;}if (pbtn->text().contains("Backspace")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Backspace, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Caps")) { if (pbtn->isChecked()) {for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toUpper());}}else {for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toLower());}}}else if(pbtn->text() == "Space") {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier, " ");QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Space, Qt::NoModifier, " ");QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Tab")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Tab, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Enter")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Shift")) {if (pbtn->isChecked()) {for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toUpper());}}else {for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toLower());}}QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Shift, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Shift, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Ctrl")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Control, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Control, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Win")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Menu, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Menu, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("Alt")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Alt, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Alt, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("↑")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Up, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("↓")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Down, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("←")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Left, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text().contains("→")) {QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier);QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Right, Qt::NoModifier);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else {QString symbol;if (ui.pushButton_shift->isChecked())symbol = pbtn->text().split("\n").at(0);elsesymbol = pbtn->text().split("\n").at(1);QKeyEvent keyPress(QEvent::KeyPress, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);QKeyEvent keyRelease(QEvent::KeyRelease, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}//取消组合键按下if (!pbtn->text().contains("Shift") && !pbtn->text().contains("Ctrl") && !pbtn->text().contains("Win") && !pbtn->text().contains("Alt")) {if (ui.pushButton_shift->isChecked()) {ui.pushButton_shift->setChecked(false);for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toLower());}}if (ui.pushButton_ctrl->isChecked())ui.pushButton_ctrl->setChecked(false);if (ui.pushButton_win->isChecked())ui.pushButton_win->setChecked(false);if (ui.pushButton_alt->isChecked())ui.pushButton_alt->setChecked(false);}
}void frmKeyBoard::slotKeyLetterButtonClicked()
{QPushButton* pbtn = (QPushButton*)sender();if (pbtn->text() >= 'a' && pbtn->text() <= 'z') {QKeyEvent keyPress(QEvent::KeyPress, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());QKeyEvent keyRelease(QEvent::KeyRelease, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}else if (pbtn->text() >= 'A' && pbtn->text() <= 'Z') {QKeyEvent keyPress(QEvent::KeyPress, int(pbtn->text().at(0).toLatin1()), Qt::NoModifier, pbtn->text());QKeyEvent keyRelease(QEvent::KeyRelease, int(pbtn->text().at(0).toLatin1()), Qt::NoModifier, pbtn->text());QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);}//取消组合键按下if (ui.pushButton_shift->isChecked()) {ui.pushButton_shift->setChecked(false);for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toLower());}}if (ui.pushButton_ctrl->isChecked())ui.pushButton_ctrl->setChecked(false);if (ui.pushButton_win->isChecked())ui.pushButton_win->setChecked(false);if (ui.pushButton_alt->isChecked())ui.pushButton_alt->setChecked(false);
}void frmKeyBoard::slotKeyNumberButtonClicked()
{QPushButton* pbtn = (QPushButton*)sender();QKeyEvent keyPress(QEvent::KeyPress, pbtn->text().toInt() + 48, Qt::NoModifier, pbtn->text());QKeyEvent keyRelease(QEvent::KeyRelease, pbtn->text().toInt() + 48, Qt::NoModifier, pbtn->text());QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);//取消组合键按下if (ui.pushButton_shift->isChecked()) {ui.pushButton_shift->setChecked(false);for (auto pbtnKey : m_letterKeys) {pbtnKey->setText(pbtnKey->text().toLower());}}if (ui.pushButton_ctrl->isChecked())ui.pushButton_ctrl->setChecked(false);if (ui.pushButton_win->isChecked())ui.pushButton_win->setChecked(false);if (ui.pushButton_alt->isChecked())ui.pushButton_alt->setChecked(false);
}
相关文章:
QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样
QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样 [1] QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样一、本自制虚拟键盘特点二、windows打开系统自带软键盘三、让键盘界面保持在最上方、不改变底层界面焦点四、长按按键重复输入键盘内容五、模拟键盘点击事件完成虚拟键盘…...
优思学院|8D和DMAIC两种方法应如何选择?
在现代的商业环境中,客户投诉是一个非常常见的问题。当客户不满意产品或服务时,他们往往会向企业发出投诉。质量管理部门是一个负责处理这些投诉的重要部门,因为它们需要确保产品和服务的质量满足客户的期望。改善方法是质量管理部门用来解决…...
回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价)
回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价) 目录 回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价)预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价) 模型描述 多元线性回归(Multip…...
PHP 二维数组相关函数:二维数组指定key排序,二维数组转一维数组,两个二维数组取差集,对象转数组,判断元素是否在多维数组中
目录 一、二维数组转一维数组 二、对二维数组进行指定key排序 三、二维数组转一维数组 四、两个二维数组取差集 五、对象转数组 六、判断元素是否在多维数组中 PHP 二维数组相关函数:二维数组转一维数组,二维数组指定key排序,两个二维数…...
演出剧院门票售票预约小程序开发制作功能介绍
基于微信小程序的票务预约小程序,广泛适用于演出主办方、剧院、艺术中心、活动中心售票、景区门票售票、儿童游乐园售票、会务签到、展会售票签到、教育培训报名预约、健身预约功能。 多场景售票支持: 售票软件支持多种场景的售票,支持选座、…...
JUC之Java内置锁的核心原理
文章目录 JUC之Java内置锁的核心原理Java对象结构对象头对象体对齐字节 Mark Word的结构信息64位Mark Word的构成 偏向锁偏向锁的设置偏向锁的重偏向偏向锁的撤销偏向锁的膨胀 轻量级锁执行过程轻量级锁的分类普通自旋锁自适应自旋锁 重量级锁偏向锁、轻量级锁与重量级锁的对比…...
【项目经理】论项目经理的自我修养
项目经理的非职权领导力 文章目录 项目经理的非职权领导力一、权利的类型二、构成权利的三要素三、沟通是实施影响力的重要手段3.1 沟通的主要类型3.2 沟通的内容和形式3.3 沟通的主要困难 四、综合沟通协调的技巧4.1 常见的负面反馈4.2 沟通技巧 五、论项目经理的自我修养5.1 …...
知识图谱学习笔记03-知识图谱的作用
语义搜索 知识图谱在语义搜索方面扮演着非常重要的角色。传统的文本搜索引擎基本上是基于关键词匹配的方式进行搜索,这种方式容易受到搜索词语的表述方式和不同语言之间的差异的影响,而无法深入理解用户的意图和查询目的。而知识图谱则提供了一种更加精…...
刚进公司就负责项目,把老弟整蒙了!
刚进公司就负责项目,把老弟整蒙了! 大家好,我是鱼皮,先把封面图送给大家: 又快到周末了,今天分享一些轻松的编程经验~ 还记得我学编程的老弟小阿巴么?他目前大二,听说最近刚刚找到…...
【Python基础入门学习】Python高级变量你了解多少?
认识高级变量 1. 列表 list1.1 列表的定义1.2 列表常用操作关键字、函数和方法 1.3 循环遍历1.4 列表嵌套1.5 应用场景 2. 元组 tuple2.1 元组的定义2.2 元组常用操作2.3 应用场景 3. 字典 dictionary3.1 字典的含义3.2 字典常用操作3.3 应用场景 4. 字符串 string4.1 字符串的…...
《LearnUE——基础指南:上篇—3》——GamePlay架构WorldContext,GameInstance,Engine之间的关系
目录 平行世界是真实存在的吗? 1.3.1 引言 1.3.2 世界管理局(WorldContext) 1.3.3 司法天神(GameInstance) 1.3.4 上帝(Engine) 1.4 总结 平行世界是真实存在的吗? 1.3.1 引言 …...
重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)
重大问题,Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的,但是,今天我将代表所有微软用户,解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…...
修改系统语言字体的方法及注意事项
Android修改系统语言字体 随着我们生活品质的提升,现在人们对于手机的依赖越来越高,而且对于手机的功能也有了更高的要求。其中,界面的字体对于我们视觉的体验感受非常重要。而在Android系统中,默认的字体可能并不符合我们的胃口。…...
19.考虑柔性负荷的综合能源系统日前优化调度模型
说明书 MATLAB代码:考虑柔性负荷的综合能源系统日前优化调度模型 关键词:柔性负荷 需求响应 综合需求响应 日前优化调度 综合能源系统 参考文档:《考虑用户侧柔性负荷的社区综合能源系统日前优化调度》参考柔性负荷和基础模型部分…...
Midjourney关键词分享!附输出AI绘画参考图
Midjourney 关键词是指用于 Midjourney 这个 AI 绘画工具的文本提示,可以影响生成图像的风格、内容、细节等。Midjourney 关键词有一些基本的语法规则和套用公式,也有一些常用的风格词汇和描述词汇,这里我以10张不同风格和类型的美女图为例&a…...
网络安全行业就职岗位有哪些?
网络安全作为目前最火的行业之一,它的细分方向很多。下面介绍一下网络安全主要的方向岗位有哪些,以及职责是什么? 一、安全规划与设计方向 岗位名称:系统安全需求分析师。 岗位职责:负责对目标对象需要达到的安全目标…...
数据库设计-范式
范式 范式就是数据库的构建规则,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF&#x…...
在前端开发中,何时应该使用 jQuery,何时应该使用 Vue.js
如果您是最近才开始进入 Web 前端开发领域的开发人员,那么您可能会听说过 jQuery。jQuery 是一个小巧而功能强大的 JavaScript 库,旨在简化跨浏览器 DOM 操作、事件处理、动画效果和 AJAX 等方面的操作,可以让开发人员更轻松地开发出高质量的…...
Promise类方法
这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个&am…...
transformer and DETR
RNN 很难并行化处理 Transformer 1、Input向量x1-x4分别乘上矩阵W得到embedding向量a1-a4。 2、向量a1-a4分别乘上Wq、Wk、Wv得到不同的qi、ki、vi(i{1,2,3,4})。 3、使用q1对每个k(ki)做attention得到a1,i(i{1,2,3,4…...
数据结构(六)—— 二叉树(4)回溯
文章目录 一、题1 257 二叉树的所有路径1.1 写法11.2 写法2 一、题 1 257 二叉树的所有路径 1.1 写法1 递归回溯:回溯是递归的副产品,只要有递归就会有回溯 首先考虑深度优先搜索;而题目要求从根节点到叶子的路径,所以需要前序…...
JVM基础知识(一)
1.整体架构和组件 1.Class Loader Class Loader(类加载器)负责将.class文件加载到JVM中,并生成对应的Java类对象(Class对象)。Java中有三种类加载器: Bootstram ClassLoader:加载核心类库&…...
ASP.NET Core Web API用户身份验证
一、JWT介绍 ASP.NET Core Web API用户身份验证的方法有很多,本文只介绍JWT方法。JWT实现了服务端无状态,在分布式服务、会话一致性、单点登录等方面凸显优势,不占用服务端资源。简单来说,JWT的验证过程如下所示: &a…...
785. 快速排序
785. 快速排序 给定你一个长度为 n n n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n n n。 第二行包含 n n n 个整数(所有整数均在 1 ∼ 1 0 9 1 \th…...
C6678学习-IPC
文章目录 1、简介2、模块MultiProc静态设置(cfg设置)动态设置 IPCNotifyMessageQShareRegion 1、简介 IPC: Inter-Processor Communication 处理器间通信,指提供多处理器环境中的处理器之间的通信、相同处理器不同线程间的通信。包括数据传递…...
利用 Delte-Sigma ADC简化电路设计
很多时候在电路中选择合适的 ADC可以很大程度上简化前端的电路。这里我们一起来看一个电阻电桥的例子: 这里用到了一只仪表放大器和一只运算放大器,他们实际上主要完成了三个功能: 1. 抑制了 2.5V的共模信号; 2. 将-1…...
如何在 Windows 11 启用 Hyper-V
准备在本机玩一下k8s,需要先启用 Hyper-V,谁知道这一打开,没有 Hyper-V选项: 1、查看功能截图: 2、以下文件保存记事本,然后重命名为*.bat pushd "%~dp0" dir /b %SystemRoot%\servicing\Packa…...
哈希表企业应用-DNA的字符串检测
DNA的字符串检测-引言 若干年后, ikun DNA 检测部成立,专门对 这些ikun的解析检测 突然发现已经完全控制不了 因为学生已经会了 而且是太会了 所以DNA采用 以下视频测试: ikun必进曲 ikun必经曲 ikun必阶曲 如何感受到了吧!,如果你现在唱跳并且还Rap 还有打篮球 还有铁山靠 那…...
Kafka运维与监控
Kafka运维与监控 Kafka运维与监控一、简介二、运维1.安装和部署安装部署 2.优化参数配置配置文件高级配置分区和副本设置分区数量设置副本数量设置 网络参数调优传输机制设置连接数和缓冲区大小设置 消息压缩和传输设置消息压缩设置消息传输设置 磁盘设置和文件系统分区磁盘容量…...
【Redis—哨兵机制】
文章目录 概念哨兵机制如何工作的监控(如何判断主节点真的故障了)哪个哨兵进行主从故障转移?故障转移流程哨兵集群 概念 当进行主从复制时,如果主节点挂掉了,那么没有主节点来服务客户端的写操作请求了,也…...
菜鸟学做网站/抚顺优化seo
http://jingyan.baidu.com/article/eae07827a820b71fec5485a9.html转载于:https://www.cnblogs.com/laowengdiaodayu/p/4626347.html...
成都最正规的装修公司/优化设计五年级下册数学答案
1、cloudera 数据压缩的一般准则 一般准则 是否压缩数据以及使用何种压缩格式对性能具有重要的影响。在数据压缩上,需要考虑的最重要的两个方面是 MapReduce 作业和存储在 HBase 中的数据。在大多数情况下,每个的原则都类似。您需要平衡压缩和解压缩数据…...
wordpress仿链家/郑州seo技术顾问
我浏览了一个关于使用Tkinter的教程,看到了以下代码:>>> from Tkinter import *>>> winTk()这将生成一个标题为Tk的框,而没有其他内容。但是,当我尝试此代码时,不会出现这样的框。我没有发现任何错误…...
网架公司名字大全/网络优化的工作内容
初中数学常见的一次函数,画起来还是相当方便的,在word中可以直接用直线工具及箭头工具,就可以搞定了。但是对于二次函数、反比例函数、三次函数、三角函数等曲线图形,要精确画出这些函数,word的图形功能就无能为力了。…...
想找人做网站和app/seo外链优化培训
1.oracle 在使用批量更新时使用case when语法时应该注意该字段必须是不能是nvchar2类型的字段,应该修改为vchar2字段类型; update ajgl_sjjbxx set ajlx(case when ajlx110000 then 01 when ajlx200000 then 02 else ajlx end)...
城乡建设部网官方网站/市场推广方案ppt
我的环境 f.lux 我的使用感受是让屏幕看起来舒服一些,因为我有近视,所以需要保护眼睛。 f.lux官网:https://justgetflux.com/ f.lux v4.47 windows 10 x64 显示器:戴尔(DELL) P2414H 我最常用的色温值:5200 f.lux zipc…...