在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-CSDN博客,知道如何自定义qml键盘后,本章继续来学习.

1.介绍

接下来我们便来自定义一款好看的qml软键盘.如下图所示:

支持背景更换、支持动图:

支持动态加载移除语言(支持多国语言,高达40多个语言):

可以看到我们选择了繁体后,返回就可以选择繁体语言了.除此之外还支持:

  • 支持拖拽、自由缩小放大、
  • 支持定位坐标、

为了让订阅专栏的朋友更加了解如何使用这款插件,在哔哩哔哩上上传了与该文章的视频讲解:

qt quick-如何使用qml虚拟软键盘插件讲解_哔哩哔哩_bilibili

2.代码实现

由于软键盘是个特殊程序,是提供给app主程序使用的,所以我们以QML插件的形式创建工程、

  • QML插件讲解:44.qt quick-qml插件详解_诺谦的博客-CSDN博客

整个工程如下所示:

其中qmldir如下所示:

module KeyboardPlugin
plugin KeyboardPlugininternal KeyboardBackImage KeyboardBackImage.qml
internal KeyboardSet KeyboardSet.qml
internal KeyboardTitle KeyboardTitle.qml
KeyboardWindow 1.0 KeyboardWindow.qmltypeinfo mymodule.qmltypes

qmldir在QML插件章节有讲解,这里定义了我们的插件是在KeyboardPlugin模块里面.后面我们就需要在主程序App.exe所在位置 创建一个KeyboardPlugin目录,然后将qml、qmldir、dll统统放进去

然后编译得到一个dll:

3.写APP主程序

在app.pro中需要定义如下所示:

RESOURCES += ../KeyboardPlugin/keyboard_plgin.qrc
# 使用静态插件
static {QT += svgQTPLUGIN += qtvirtualkeyboardplugin
}win32 {contains(QT_ARCH, x86_64) {message("x64")# 输出目录DESTDIR = $$PWD/../outputX64/} else {message("win32")# 输出目录DESTDIR = $$PWD/../outputWin32/}
}

我们这里指定了输出目录,因为我们要将编译好的KeyboardPlugin模块插件放到exe所在的路径下,让app能够找到键盘.

我们以outputWin32目录为例,在该目录下创建个KeyboardPlugin目录(我们的插件模块),然后将键盘插件的qml、qmldir、dll都放进来:

然后在main.cpp中导入键盘:

最后写main.qml:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.14
import KeyboardPlugin 1.0
import "qrc:/keyboard_plugin/"
Window {id: windowvisible: truewidth: 640height: 595title: qsTr("Hello World")/*使用键盘插件*/KeyboardWindow {id: keyboardmainObj: window}Column {id: textEditorsspacing: 15anchors.fill: parentLabel {color: "#565758"text: "全局键盘示例"anchors.horizontalCenter: parent.horizontalCenterfont.pixelSize: 22}TextField {width: parent.widthplaceholderText: "One line field"font.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}TextField {id: passwordFieldwidth: parent.widthechoMode: TextInput.PasswordplaceholderText: "密码区域"inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveTextfont.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}TextField {id: upperCaseFieldwidth: parent.widthplaceholderText: "Upper case field"inputMethodHints: Qt.ImhUppercaseOnlyfont.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}TextField {id: lowerCaseFieldwidth: parent.widthplaceholderText: "Lower case field"inputMethodHints: Qt.ImhLowercaseOnlyfont.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}TextField {id: phoneNumberFieldvalidator: RegExpValidator { regExp: /^[0-9\+\-\#\*\ ]{6,}$/ }width: parent.widthplaceholderText: "拨打电话模式"inputMethodHints: Qt.ImhDialableCharactersOnlyfont.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}TextField {id: formattedNumberFieldwidth: parent.widthplaceholderText: "仅支持数字或者符号"inputMethodHints: Qt.ImhFormattedNumbersOnlyfont.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}TextArea {id: textAreawidth: parent.widthheight: 70placeholderText: "多行编辑"font.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}background: Rectangle {color: "#eeeeee"}}TextField {id: digitsFieldwidth: parent.widthplaceholderText: "只允许使用数字"inputMethodHints: Qt.ImhDigitsOnlyfont.pixelSize: 20onPressed: {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}onFocusChanged: if (focus) {keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)}}}
}

这里我们定义了一个KeyboardWindow组件、然后每次当焦点为true 或者 用户点击输入框的时候,就调用keyboard.targetOpen(this, KeyboardWindow.BaseToHorizontal)、

  • 第一个参数 : 用来定位键盘的坐标,始终在输入框下面显示
  • 第二个参数 : 设置键盘的水平对齐方式、我们这里是居中显示

如下图所示:

qml键盘插件源码和App程序已经上传至专栏群(第一章底部获取)中,感兴趣的自行下载、
入群需验证订阅用户名,尽量选择"订阅专栏"、"学习会员"会验证失败、

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)相关推荐

  1. Qt Quick QML实现自定义虚拟软键盘详解

    Qt Quick QML实现自定义虚拟软键盘详解 在Qt5.8版本推出的QML软键盘功能中,有两种实现方案.一种是基于中文汉字数据库,另一种是基于Google拼音输入引擎.然而,相比于官方软键盘,这两 ...

  2. Qt实现屏幕虚拟软键盘

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 Qt编写输入法V2018 ...

  3. pyqt5 和 pySinde2 动态加载 QT Designer

    加粗样式@TOC from PyQt5 import uic # 导入 动态加载 ui文件 库 from PyQt5.QtWidgets import QApplication, QMainWindo ...

  4. QML进阶(十)动态加载QML元素

    通过搭配QML和JavaScript我们可以动态的对QML元素的生命周期进行管理.实现动态加载元素.动态实例化元素.动态销毁元素.同时我们还可以将动态创建的元素持久化到本地,并在需要的时候进行恢复使用 ...

  5. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

    java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...

  6. WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探

    原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感觉WPF的开发思 ...

  7. Flutter 动态加载自定义字体

    Flutter中使用自定义字体 场景1, 加载特定字体,在开发前字体文件就已确定,可以使用 参考 flutter开发文档Use a custom font | Flutter,这里就不再描述. 场景2 ...

  8. c语言中用qt写换肤,让Qt应用程序支持换肤(Skin)功能

    Qt程序一直给人的印象是正规的GUI程序的模样.在嵌入式Linux下,Qtopia的桌面看起来跟WinCE桌面没有什么两样.相对IPHONE那样的漂亮界面.实在没有什么吸引力. 因此很多嵌入式开发人员 ...

  9. java 自定义classloader_编写自定义classloader实现类的动态加载

    目标:实现类的动态加载 原理:使用java的自定义classloader机制实现类的动态加载. 代码实现://自定义classloader public class StrategyClassLoad ...

最新文章

  1. Linux ekho
  2. JUC并发编程一 并发架构
  3. Windows 10安装pip方法
  4. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...
  5. VMware创建Linux及局域网内独立访问IP和访问外网IP的配置
  6. ios浏览器微信支付回调页面_iOS微信系列,WKWebview加载H5进行微信支付返回浏览器解决方案!...
  7. Java Sigar Windows 监控系统
  8. node中封装MongoDB
  9. (附源码)ssm网上购物系统 毕业设计 123361
  10. 皮尔逊相关系数,斯皮尔曼等级相关系数,(易错!!)假设检验 ,SPSS
  11. 超声光学成像突破衍射极限
  12. DataV-组件配置
  13. Modulo Sum
  14. Python-懒人必备-语音小助手
  15. 基于PHP的酒店管理系统
  16. ubuntu vi/vim退出文件
  17. Wireles Tools移植
  18. type object ‘TestGetToken‘ has no attribute ‘test_right_gett_token‘
  19. 家庭新成员:德牧听泉
  20. java人点灯问题_JAVA学习,写的一个点灯小游戏

热门文章

  1. 【JPress】简介、Linux部署与项目分析
  2. Windows下Miktex安装MathTimePro2
  3. jquery ajax 点击按钮,Jquery ajax调用点击事件提交按钮
  4. 苹果手机充电口接触不良怎么办_苹果杀死充电口
  5. deepin-wine 微信“在文件夹中显示”菜单无效的问题
  6. R语言使用sqrt函数计算平方根、开平方根
  7. android fun os,vivo也要吃上奥利奥!FuntouchOS宣布Android Oreo机型适配列表
  8. tensorflow 按维度相加_Pioneer DJ号称全新维度的CDJ-3000到底如何?_品牌新闻_品牌...
  9. kmp(看毛片)算法
  10. 2019写给对象的话_写给对象的一段话暖心