46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)
在上章我们学习了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虚拟软键盘-支持换肤、动态加载移除语言(二)相关推荐
- Qt Quick QML实现自定义虚拟软键盘详解
Qt Quick QML实现自定义虚拟软键盘详解 在Qt5.8版本推出的QML软键盘功能中,有两种实现方案.一种是基于中文汉字数据库,另一种是基于Google拼音输入引擎.然而,相比于官方软键盘,这两 ...
- Qt实现屏幕虚拟软键盘
作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 Qt编写输入法V2018 ...
- pyqt5 和 pySinde2 动态加载 QT Designer
加粗样式@TOC from PyQt5 import uic # 导入 动态加载 ui文件 库 from PyQt5.QtWidgets import QApplication, QMainWindo ...
- QML进阶(十)动态加载QML元素
通过搭配QML和JavaScript我们可以动态的对QML元素的生命周期进行管理.实现动态加载元素.动态实例化元素.动态销毁元素.同时我们还可以将动态创建的元素持久化到本地,并在需要的时候进行恢复使用 ...
- java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...
java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感觉WPF的开发思 ...
- Flutter 动态加载自定义字体
Flutter中使用自定义字体 场景1, 加载特定字体,在开发前字体文件就已确定,可以使用 参考 flutter开发文档Use a custom font | Flutter,这里就不再描述. 场景2 ...
- c语言中用qt写换肤,让Qt应用程序支持换肤(Skin)功能
Qt程序一直给人的印象是正规的GUI程序的模样.在嵌入式Linux下,Qtopia的桌面看起来跟WinCE桌面没有什么两样.相对IPHONE那样的漂亮界面.实在没有什么吸引力. 因此很多嵌入式开发人员 ...
- java 自定义classloader_编写自定义classloader实现类的动态加载
目标:实现类的动态加载 原理:使用java的自定义classloader机制实现类的动态加载. 代码实现://自定义classloader public class StrategyClassLoad ...
最新文章
- Linux ekho
- JUC并发编程一 并发架构
- Windows 10安装pip方法
- 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...
- VMware创建Linux及局域网内独立访问IP和访问外网IP的配置
- ios浏览器微信支付回调页面_iOS微信系列,WKWebview加载H5进行微信支付返回浏览器解决方案!...
- Java Sigar Windows 监控系统
- node中封装MongoDB
- (附源码)ssm网上购物系统 毕业设计 123361
- 皮尔逊相关系数,斯皮尔曼等级相关系数,(易错!!)假设检验 ,SPSS
- 超声光学成像突破衍射极限
- DataV-组件配置
- Modulo Sum
- Python-懒人必备-语音小助手
- 基于PHP的酒店管理系统
- ubuntu vi/vim退出文件
- Wireles Tools移植
- type object ‘TestGetToken‘ has no attribute ‘test_right_gett_token‘
- 家庭新成员:德牧听泉
- java人点灯问题_JAVA学习,写的一个点灯小游戏
热门文章
- 【JPress】简介、Linux部署与项目分析
- Windows下Miktex安装MathTimePro2
- jquery ajax 点击按钮,Jquery ajax调用点击事件提交按钮
- 苹果手机充电口接触不良怎么办_苹果杀死充电口
- deepin-wine 微信“在文件夹中显示”菜单无效的问题
- R语言使用sqrt函数计算平方根、开平方根
- android fun os,vivo也要吃上奥利奥!FuntouchOS宣布Android Oreo机型适配列表
- tensorflow 按维度相加_Pioneer DJ号称全新维度的CDJ-3000到底如何?_品牌新闻_品牌...
- kmp(看毛片)算法
- 2019写给对象的话_写给对象的一段话暖心