补充 VirtualKeyboard.

Signed-off-by: Rick.Chan <cy@haoan119.com>
This commit is contained in:
Rick.Chan 2023-01-06 18:25:50 +08:00
parent f77c1fa8d9
commit 0cbab163ec
2 changed files with 129 additions and 17 deletions

View File

@ -25,13 +25,14 @@
- [10. ScrollView](#10-scrollview) - [10. ScrollView](#10-scrollview)
- [11. GridView](#11-gridview) - [11. GridView](#11-gridview)
- [12. BusyIndicator](#12-busyindicator) - [12. BusyIndicator](#12-busyindicator)
- [13. QML 与 C++ 交互](#13-qml-与-c-交互) - [13. VirtualKeyboard](#13-virtualkeyboard)
- [13.1. QML 访问 C++ 中声明的类型](#131-qml-访问-c-中声明的类型) - [14. QML 与 C++ 交互](#14-qml-与-c-交互)
- [13.2. C++ 访问 QML 对象](#132-c-访问-qml-对象) - [14.1. QML 访问 C++ 中声明的类型](#141-qml-访问-c-中声明的类型)
- [13.3. 通过信号槽传递自建类型](#133-通过信号槽传递自建类型) - [14.2. C++ 访问 QML 对象](#142-c-访问-qml-对象)
- [13.4. QML 与 C++ 交互综合示例](#134-qml-与-c-交互综合示例) - [14.3. 通过信号槽传递自建类型](#143-通过信号槽传递自建类型)
- [14. Windows 下 QML 程序的打包发布](#14-windows-下-qml-程序的打包发布) - [14.4. QML 与 C++ 交互综合示例](#144-qml-与-c-交互综合示例)
- [15. 外部参考资料](#15-外部参考资料) - [15. Windows 下 QML 程序的打包发布](#15-windows-下-qml-程序的打包发布)
- [16. 外部参考资料](#16-外部参考资料)
## 1. 基础部分 ## 1. 基础部分
@ -549,7 +550,56 @@ Window {
可以对 BusyIndicator 进行自定义。 可以对 BusyIndicator 进行自定义。
## 13. QML 与 C++ 交互 ## 13. VirtualKeyboard
一些涉及触屏的应用会涉及到虚拟键盘/软键盘的应用不同系统平台上往往会提供不同的软键盘工具但相比之下Qt 内嵌的 VirtualKeyboard 更加易用,并具有很好的跨平台能力,中文(拼音)、英文以及其他主要语言的支持能力也比较好。
若使用 VirtualKeyboard只需要在创建“Qt Quick Application”时选中“Use Qt Virtual Keyboard”旧版本 QtCreator 没有该选项)即可自动向项目添加 VirtualKeyboard 功能。
对比源码不难发现,启用 VirtualKeyboard 后主要在 main.cpp 中增加了:
```cpp
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
```
在 main.qml 中增加了:
```js
import QtQuick.VirtualKeyboard 2.4
Window {
InputPanel {
states: State {
// ...
}
transitions: Transition {
// ...
}
}
}
```
可以使用 VirtualKeyboardSettings 对 VirtualKeyboard 进行一些设置,这是一个全局对象,在 QML 中直接通过 VirtualKeyboardSettings.xxxxx 方式使用即可。VirtualKeyboardSettings 可对键盘风格、语言列表进行设置。需要特殊说明的是VirtualKeyboard 所支持的语言列表是在编译时决定的,通过 VirtualKeyboardSettings.activeLocales 可以获得当前支持的语言列表;而 VirtualKeyboardSettings.activeLocales 可以在应用程序中临时限定允许使用的语言,最终在 Qt 的虚拟键盘中允许切换的语言为二者的交集。如下示例限制 VirtualKeyboard 只可以使用“简体中文”和“英文”输入法,如果编译 VirtualKeyboard 没有使能中文输入法则最终只能使用英文输入:
```js
import QtQuick.VirtualKeyboard.Settings 2.4
Window {
Component.onCompleted: {
VirtualKeyboardSettings.activeLocales = ["zh_CN", "en_US"]
}
}
```
如果是使用 Qt 提供的安装包来安装 VirtualKeyboard 模块则默认开启了中文支持,部分系统如 Ubuntu 中使用 apt 进行安装的可能不支持中文,可改用官方安装包来安装 Qt 或使用源码自行编译,注意在编译 VirtualKeyboard 的 qmake 阶段需要增加:
```makefile
CONFIG+="lang-en_GB lang-zh_CN"
```
更多关于 VirtualKeyboard 的应用可以参考官方自带示例。
## 14. QML 与 C++ 交互
QML 与 C++ 交互的主要实现方式是: QML 与 C++ 交互的主要实现方式是:
@ -561,7 +611,7 @@ QML 与 C++ 交互的主要实现方式是:
QML 与 C++ 之间主要通过信号槽机制来传递消息。 QML 与 C++ 之间主要通过信号槽机制来传递消息。
### 13.1. QML 访问 C++ 中声明的类型 ### 14.1. QML 访问 C++ 中声明的类型
QML 使用 C++ 中声明的类型可以为类、结构体或枚举等。若需要将 C++ 类导出给 QML则需要使用 qmlRegisterType() 方法进行注册: QML 使用 C++ 中声明的类型可以为类、结构体或枚举等。若需要将 C++ 类导出给 QML则需要使用 qmlRegisterType() 方法进行注册:
@ -586,7 +636,7 @@ engine.rootContext()->setContextProperty("qmlObj", cObj);
将 C++ 对象注册到 QML 上下文环境中。 将 C++ 对象注册到 QML 上下文环境中。
### 13.2. C++ 访问 QML 对象 ### 14.2. C++ 访问 QML 对象
在 QML 中为对象添加 objectName 属性后,在 C++ 中可使用: 在 QML 中为对象添加 objectName 属性后,在 C++ 中可使用:
@ -599,7 +649,7 @@ auto qmlObj = root.first()->findChild<QObject*>("object name");
大部分情况下在 QML 中访问 C++ 即可实现较完善的功能QML 传递信息给 C++ 完全可以通过信号槽机制实现。除非需要在 C++ 中动态创建对象并连接到 QML 中的信号槽,否则没必要这样设计。 大部分情况下在 QML 中访问 C++ 即可实现较完善的功能QML 传递信息给 C++ 完全可以通过信号槽机制实现。除非需要在 C++ 中动态创建对象并连接到 QML 中的信号槽,否则没必要这样设计。
### 13.3. 通过信号槽传递自建类型 ### 14.3. 通过信号槽传递自建类型
当使用信号槽机制时,需要注意一点:如果需要通过信号槽传递自建类型数据,需要使用 qRegisterMetaType() 方法进行注册。 当使用信号槽机制时,需要注意一点:如果需要通过信号槽传递自建类型数据,需要使用 qRegisterMetaType() 方法进行注册。
@ -607,7 +657,7 @@ auto qmlObj = root.first()->findChild<QObject*>("object name");
qRegisterMetaType<MyClass>("Myclass"); qRegisterMetaType<MyClass>("Myclass");
``` ```
### 13.4. QML 与 C++ 交互综合示例 ### 14.4. QML 与 C++ 交互综合示例
该示例包含以下文件: 该示例包含以下文件:
@ -958,7 +1008,7 @@ Window {
} }
``` ```
## 14. Windows 下 QML 程序的打包发布 ## 15. Windows 下 QML 程序的打包发布
Qt 提供了导出 Qt 环境变量的命令行脚本比如“Qt 5.15.2 (MinGW 8.1.0 64-bit)”,运行该脚本可进入带有 Qt 环境变量的命令行界面,之后可通过如下命令打包程序(编译生成的可执行程序需要拷贝到\<Package Output Path\> Qt 提供了导出 Qt 环境变量的命令行脚本比如“Qt 5.15.2 (MinGW 8.1.0 64-bit)”,运行该脚本可进入带有 Qt 环境变量的命令行界面,之后可通过如下命令打包程序(编译生成的可执行程序需要拷贝到\<Package Output Path\>
@ -969,7 +1019,7 @@ windeployqt <Exe File> [--qmldir <Project QML File Path>]
Qt 自带的打包程序会添加额外的库,如果想进一步减小体积,可手动筛减。 Qt 自带的打包程序会添加额外的库,如果想进一步减小体积,可手动筛减。
## 15. 外部参考资料 ## 16. 外部参考资料
1. [深入了解JS中的整数](https://www.jianshu.com/p/1ba45c3894ab) 1. [深入了解JS中的整数](https://www.jianshu.com/p/1ba45c3894ab)
2. [QML 中的信号与槽](https://blog.csdn.net/Love_XiaoQinEr/article/details/123746983) 2. [QML 中的信号与槽](https://blog.csdn.net/Love_XiaoQinEr/article/details/123746983)
@ -983,3 +1033,5 @@ Qt 自带的打包程序会添加额外的库,如果想进一步减小体积
10. [QML Connections: Implicitly defined onFoo properties in Connections are deprecated.](https://blog.csdn.net/weixin_43720622/article/details/112346039) 10. [QML Connections: Implicitly defined onFoo properties in Connections are deprecated.](https://blog.csdn.net/weixin_43720622/article/details/112346039)
11. [QML 调用 C++ 方法](https://blog.csdn.net/woshouji1/article/details/121348179) 11. [QML 调用 C++ 方法](https://blog.csdn.net/woshouji1/article/details/121348179)
12. [Qml 与 C++ 交互3Qml 的信号与 C++ 的槽函数连接](https://blog.csdn.net/tanxuan231/article/details/124990296) 12. [Qml 与 C++ 交互3Qml 的信号与 C++ 的槽函数连接](https://blog.csdn.net/tanxuan231/article/details/124990296)
13. [Qt-虚拟键盘](https://blog.csdn.net/qq_39175540/article/details/87972667)
14. [Qt5软键盘实现中文拼音输入法](https://blog.csdn.net/onlyshi/article/details/78408000)

View File

@ -5,6 +5,7 @@
- [2. QT\_DEBUG\_PLUGINS](#2-qt_debug_plugins) - [2. QT\_DEBUG\_PLUGINS](#2-qt_debug_plugins)
- [3. Online Install/MaintenanceTool 加速](#3-online-installmaintenancetool-加速) - [3. Online Install/MaintenanceTool 加速](#3-online-installmaintenancetool-加速)
- [4. MaintenanceTool 添加/删除组件时只显示已安装的组件 或 无法正常升级组件](#4-maintenancetool-添加删除组件时只显示已安装的组件-或-无法正常升级组件) - [4. MaintenanceTool 添加/删除组件时只显示已安装的组件 或 无法正常升级组件](#4-maintenancetool-添加删除组件时只显示已安装的组件-或-无法正常升级组件)
- [5. Linux Online Install 没有图标](#5-linux-online-install-没有图标)
## 1. -platform ## 1. -platform
@ -27,12 +28,71 @@ export QT_DEBUG_PLUGINS=1
## 3. Online Install/MaintenanceTool 加速 ## 3. Online Install/MaintenanceTool 加速
```bash ```bash
./qt-unified-windows-x64-online.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt # For Windows
./qt-unified-linux-x64-online.run --mirror https://mirrors.tuna.tsinghua.edu.cn/qt qt-unified-windows-x64-online.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt
MaintenanceTool.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt MaintenanceTool.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt
./MaintenanceTool --mirror https://mirrors.tuna.tsinghua.edu.cn/qt
# For Linux
sudo ./qt-unified-linux-x64-online.run --mirror https://mirrors.tuna.tsinghua.edu.cn/qt
sudo ./MaintenanceTool --mirror https://mirrors.tuna.tsinghua.edu.cn/qt
``` ```
## 4. MaintenanceTool 添加/删除组件时只显示已安装的组件 或 无法正常升级组件 ## 4. MaintenanceTool 添加/删除组件时只显示已安装的组件 或 无法正常升级组件
原因是 MaintenanceTool 本地缓存没有更新,启动 MaintenanceTool 后点击右下角的“设置”按钮,点击“本地缓存->清空缓存”。再按正常流程添加/删除/升级 组件即可。 原因是 MaintenanceTool 本地缓存没有更新,启动 MaintenanceTool 后点击右下角的“设置”按钮,点击“本地缓存->清空缓存”。再按正常流程添加/删除/升级 组件即可。
## 5. Linux Online Install 没有图标
需要手动创建 Desktop Entry
```bash
sudo cp /opt/Qt/Tools/QtDesignStudio/share/icons/hicolor/* /usr/share/icons/hicolor
cd /usr/share/icons/hicolor
sudo gtk-update-icon-cache -f -t ./
sudo touch org.qt-project.qtcreator.desktop
sudo touch org.qt-project.qtdesignstudio.desktop
sudo touch org.qt-project.maintenancetool.desktop
```
sudo 编辑三个 .desktop 文件,内容如下:
```ini
[Desktop Entry]
Type=Application
Exec=/opt/Qt/Tools/QtCreator/bin/qtcreator %F
Name=Qt Creator
GenericName=C++ IDE for developing Qt applications
X-KDE-StartupNotify=true
Icon=QtProject-qtcreator
StartupWMClass=qtcreator
Terminal=false
Categories=Development;IDE;Qt;
MimeType= text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;
```
```ini
[Desktop Entry]
Type=Application
Exec=/opt/Qt/Tools/QtDesignStudio/bin/qtdesignstudio
Name=Qt Design Studio
GenericName=Qt Design Studio
X-KDE-StartupNotify=true
Icon=QtProject-qtcreator
StartupWMClass=qtdesignstudio
Terminal=false
Categories=Development;IDE;Qt;
```
```ini
[Desktop Entry]
Type=Application
Exec=/opt/Qt/MaintenanceTool --mirror https://mirrors.tuna.tsinghua.edu.cn/qt
Name=Qt Maintenance Tool
GenericName=Qt Maintenance Tool
X-KDE-StartupNotify=true
Icon=QtProject-qtcreator
StartupWMClass=MaintenanceTool
Terminal=false
Categories=Development;Qt;
```