介绍该键盘项目的代码实现。

1.布局

采用垂直布局

QHBoxLayout *h1();
QHBoxLayout *h2();
QHBoxLayout *h3();
QHBoxLayout *h4();QVBoxLayout *layout = new QVBoxLayout();
layout->setSpacing(BUTTON_SPACING_RATIO*height());
layout->addLayout(h1());
layout->addLayout(h2());
layout->addLayout(h3());
layout->addLayout(h4());mainLayout->addStretch();
mainLayout->addLayout(layout);
mainLayout->addStretch();

2.KeyButton生成

  • 从第一行的键盘布局代码中可以看到,使用for循环创建KeyButton。
QHBoxLayout *Keyboard::h1()
{QHBoxLayout *h = new QHBoxLayout;...for (int i = 0; i < modeListBar1.count(); i++) {KeyButton *button = createButton(modeListBar1.at(i));h->addWidget(button);}...
}

  • 创建createButton中传递按键的三个状态信息(以第一行为例)。
KeyButton *Keyboard::createButton(QList<KeyButton::Mode> modes)
{KeyButton *button = new KeyButton(modes, this);button->onReponse(this, SLOT(onKeyPressed(const int&, const QString&)));button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);return button;
}

  • 每一行内容分别分为小写状态,大写状态,字符状态。
const QList<Modes> modeListBar1 = {{{Qt::Key_Q, "q"}, {Qt::Key_Q, "Q"}, {Qt::Key_1, "1"}},{{Qt::Key_W, "w"}, {Qt::Key_W, "W"}, {Qt::Key_2, "2"}},{{Qt::Key_E, "e"}, {Qt::Key_E, "E"}, {Qt::Key_3, "3"}},{{Qt::Key_R, "r"}, {Qt::Key_R, "R"}, {Qt::Key_4, "4"}},{{Qt::Key_T, "t"}, {Qt::Key_T, "T"}, {Qt::Key_5, "5"}},{{Qt::Key_Y, "y"}, {Qt::Key_Y, "Y"}, {Qt::Key_6, "6"}},{{Qt::Key_U, "u"}, {Qt::Key_U, "U"}, {Qt::Key_7, "7"}},{{Qt::Key_I, "i"}, {Qt::Key_I, "I"}, {Qt::Key_8, "8"}},{{Qt::Key_O, "o"}, {Qt::Key_O, "O"}, {Qt::Key_9, "9"}},{{Qt::Key_P, "p"}, {Qt::Key_P, "P"}, {Qt::Key_0, "0"}},
};

  • 根据传递的信息默认显示小写状态的内容。
KeyButton::KeyButton(const QList<KeyButton::Mode> modes, QWidget *parent) :QPushButton(parent)
{...if (!modes.isEmpty()) {m_preMode = m_mode = m_modes.first();setText(m_mode.display);}connect(this, SIGNAL(pressed()), this, SLOT(onPressed()));
}

3.按键状态切换

  • 键盘存在三种形态,小写状态,大写状态,字符状态。
  • 一个按键存在三种状态,意味​按键有三种状态切换,当键盘Keyboard类绑定切换状态的按键,进行响应的操作。当键盘Keyboard类绑定切换状态的按键,进行响应的操作。
  • 通过按键的状态值来绑定Keyboard的处理信号(switchCapsLock(),switchSpecialChar())。
void Keyboard::resizeButton()
{foreach (KeyButton *button, findChildren<KeyButton *>()) {...switch (button->mode().key) {case Qt::Key_CapsLock:...connect(button, SIGNAL(pressed()), this, SLOT(switchCapsLock()), Qt::UniqueConnection);break;case Qt::Key_Mode_switch:...connect(button, SIGNAL(pressed()), this, SLOT(switchSpecialChar()), Qt::UniqueConnection);break;default:break;}}...
}
  • 触发切换大写状态,遍历设置每个按键的switchCapsLock()函数。
void Keyboard::switchCapsLock()
{QList<KeyButton *> buttons = findChildren<KeyButton *>();foreach(KeyButton *button, buttons)button->switchCapsLock();
}
  • KeyButton的switchCapsLock()函数切换按键显示的内容。
void KeyButton::switchCapsLock()
{if (m_mode.type == SpecialChar)return;m_preMode = m_mode;m_mode = find(m_mode.type == LowerCase ? UpperCase : LowerCase);setText(m_mode.display);
}

4.发送模拟事件到焦点窗口

  • 当创建按键的同时也会绑定AbstractKeyboard的onKeyPressed槽函数。
KeyButton *button = new KeyButton(modes, this);
button->onReponse(this, SLOT(onKeyPressed(const int&, const QString&)));
  • 使用QApplication的sendEvent发送按键事件到焦点窗口。
void AbstractKeyboard::onKeyPressed(int key, QString value)
{QWidget *receiver = QApplication::focusWidget();if (!receiver)return;QKeyEvent keyPress(QEvent::KeyPress,     key, Qt::NoModifier, value);QKeyEvent keyRelease(QEvent::KeyRelease, key, Qt::NoModifier, value);QApplication::sendEvent(receiver, &keyPress);QApplication::sendEvent(receiver, &keyRelease);
}

轻量级Qt键盘-实现篇相关推荐

  1. 轻量级Qt键盘-中文输入

    在原有的键盘基础上新增中文输入功能. 中文候选栏   中文输入候选栏ChineseWidget使用QListWidget和样式表实现: setText输入对应拼音字母,即会加载符合的拼音中文. pre ...

  2. 轻量级Qt键盘-更新谷歌汉字库

      收集了近期网友反馈的问题,除了更新谷歌汉字库,还有下列的更新: 添加长按按键重复触发按键的功能: 添加文泉驿字体. 修正了不能输入字符'.'的问题: 优化中文输入卡顿的问题:   可通过设置项目文 ...

  3. Qt键盘事件(二)——长按按键反复触发event事件问题解决

    1.问题描述 在Jungle的上一篇文章中(Qt键盘事件(一)--检测按键输入及解决无法响应方向键问题),Jungle简单实现了利用qt检测用户按键操作并将键按下\释放操作打印在Qt界面上的一个小程序 ...

  4. qt ui界面无法移动控件_使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能...

    已结贴√ 问题点数:20 回复次数:2 使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能 我做的是一个贪吃蛇游戏,现在我想实现的功能是:按下键盘上的上下左右箭头的方向按键时, ...

  5. Qt键盘事件实现图片在窗口上下左右移动

    Qt键盘事件实现图片在窗口上下左右移动 标签(空格分隔): 键盘事件 一.项目内容: 新建桌面应用程序testKeyEvent,类名KeyEvent,基类QWidget,通过重写键盘事件到达操作的键盘 ...

  6. xmanager远程Qt键盘错位或者重复输入问题

    ---------------- 版权声明:本文为CSDN博主「111辄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csd ...

  7. Qt助手翻译篇之—— QGrapicsItem类

    这个类翻译了好久,实在是成员函数太多了,分享出来,希望对大家有用,多多支持哦~~ 详细介绍 QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形类,它为绘 ...

  8. 嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇

    计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的.我们最多需要"精通 "三种语言,最佳拍档是汇编.C.C++(或JAVA),很显然,如果你&qu ...

  9. QT键盘响应卡顿的解决方法

    1.不要将事件在键盘响应事件中执行,应在键盘响应事件出设置布尔型变量. 例如: void Widget:: keyPressEvent(QKeyEvent *key)//检测键盘按下{Q_UNUSED ...

最新文章

  1. DFS分布式文件系统 不同用户访问不同服务器修改同一文件 解决方案
  2. 树莓派基于 Linux 的 Windows XP 现已可用
  3. 用java调用oracle存储过程总结一
  4. BUUCTF crackMe
  5. 一个用于 Angular 开发的 Chrome 扩展 - Angular Dev Tools
  6. Linux之dd命令详解
  7. java 中文域名转码_转换java方法
  8. 高达100亿美元!美国国防部将IBM和甲骨文双双踢出了云计算合同;华为任正非说了,华为对向苹果等对手出售5G芯片保持开放的态度...
  9. [BuildRelease Management]ElectricCommander
  10. 安卓psp模拟器哪个好_手机psp模拟器哪个好_安卓PSP模拟器中文官方版下载_66游戏网...
  11. nodejs 遍历json数据_异步-使用node.js遍历JSON
  12. 体重测试仪软件,一键校准身高体重测量仪
  13. 主成分分析(PCA)详解
  14. Win8右键反应慢的原因与解决办法
  15. 广度优先搜索BFS-P3456 [POI2007]GRZ-Ridges and Valleys
  16. es拼音分词 大帅哥_SpringBoot集成Elasticsearch 进阶,实现中文、拼音分词,繁简体转换...
  17. go每日新闻--2020-12-23
  18. 在虚拟机上同步服务器上的时间_Hbase
  19. 管理每日待办事项的日程安排APP有吗?
  20. 基于OPC 技术的上位机与S7-200 系列PLC通讯的实现

热门文章

  1. android——利用gradle实现多渠道打包并自定义包名(umeng多渠道)
  2. Arduino利用红外感应控制舵机
  3. ResNet、ResNeXt详解以及代码实现
  4. 烽火移动设备管理:企业安全管理无处遁形
  5. OLED显示STM32
  6. vue:element ui分页改变pageSize,触发两次回调请求
  7. 备份一体机的制作原理以及工艺
  8. Servlet 容器和 Web 服务器的区别
  9. Tomcat是一个Servlet容器?
  10. C++程序报错0xc000007b解决方法