diff --git a/Software/Development/Environment/Qt/QML/QML_应用程序开发技术总结.md b/Software/Development/Environment/Qt/QML/QML_应用程序开发技术总结.md index bf6a4ed..3d11c6b 100644 --- a/Software/Development/Environment/Qt/QML/QML_应用程序开发技术总结.md +++ b/Software/Development/Environment/Qt/QML/QML_应用程序开发技术总结.md @@ -25,13 +25,14 @@ - [10. ScrollView](#10-scrollview) - [11. GridView](#11-gridview) - [12. BusyIndicator](#12-busyindicator) - - [13. QML 与 C++ 交互](#13-qml-与-c-交互) - - [13.1. QML 访问 C++ 中声明的类型](#131-qml-访问-c-中声明的类型) - - [13.2. C++ 访问 QML 对象](#132-c-访问-qml-对象) - - [13.3. 通过信号槽传递自建类型](#133-通过信号槽传递自建类型) - - [13.4. QML 与 C++ 交互综合示例](#134-qml-与-c-交互综合示例) - - [14. Windows 下 QML 程序的打包发布](#14-windows-下-qml-程序的打包发布) - - [15. 外部参考资料](#15-外部参考资料) + - [13. VirtualKeyboard](#13-virtualkeyboard) + - [14. QML 与 C++ 交互](#14-qml-与-c-交互) + - [14.1. QML 访问 C++ 中声明的类型](#141-qml-访问-c-中声明的类型) + - [14.2. C++ 访问 QML 对象](#142-c-访问-qml-对象) + - [14.3. 通过信号槽传递自建类型](#143-通过信号槽传递自建类型) + - [14.4. QML 与 C++ 交互综合示例](#144-qml-与-c-交互综合示例) + - [15. Windows 下 QML 程序的打包发布](#15-windows-下-qml-程序的打包发布) + - [16. 外部参考资料](#16-外部参考资料) ## 1. 基础部分 @@ -549,7 +550,56 @@ Window { 可以对 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++ 交互的主要实现方式是: @@ -561,7 +611,7 @@ QML 与 C++ 交互的主要实现方式是: QML 与 C++ 之间主要通过信号槽机制来传递消息。 -### 13.1. QML 访问 C++ 中声明的类型 +### 14.1. QML 访问 C++ 中声明的类型 QML 使用 C++ 中声明的类型可以为类、结构体或枚举等。若需要将 C++ 类导出给 QML,则需要使用 qmlRegisterType() 方法进行注册: @@ -586,7 +636,7 @@ engine.rootContext()->setContextProperty("qmlObj", cObj); 将 C++ 对象注册到 QML 上下文环境中。 -### 13.2. C++ 访问 QML 对象 +### 14.2. C++ 访问 QML 对象 在 QML 中为对象添加 objectName 属性后,在 C++ 中可使用: @@ -599,7 +649,7 @@ auto qmlObj = root.first()->findChild("object name"); 大部分情况下在 QML 中访问 C++ 即可实现较完善的功能,QML 传递信息给 C++ 完全可以通过信号槽机制实现。除非需要在 C++ 中动态创建对象并连接到 QML 中的信号槽,否则没必要这样设计。 -### 13.3. 通过信号槽传递自建类型 +### 14.3. 通过信号槽传递自建类型 当使用信号槽机制时,需要注意一点:如果需要通过信号槽传递自建类型数据,需要使用 qRegisterMetaType() 方法进行注册。 @@ -607,7 +657,7 @@ auto qmlObj = root.first()->findChild("object name"); qRegisterMetaType("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 环境变量的命令行界面,之后可通过如下命令打包程序(编译生成的可执行程序需要拷贝到\): @@ -969,7 +1019,7 @@ windeployqt [--qmldir ] Qt 自带的打包程序会添加额外的库,如果想进一步减小体积,可手动筛减。 -## 15. 外部参考资料 +## 16. 外部参考资料 1. [深入了解JS中的整数](https://www.jianshu.com/p/1ba45c3894ab) 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) 11. [QML 调用 C++ 方法](https://blog.csdn.net/woshouji1/article/details/121348179) 12. [Qml 与 C++ 交互3:Qml 的信号与 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) diff --git a/Software/Development/Environment/Qt/Qt_使用技巧.md b/Software/Development/Environment/Qt/Qt_使用技巧.md index 212ef29..b4585c2 100644 --- a/Software/Development/Environment/Qt/Qt_使用技巧.md +++ b/Software/Development/Environment/Qt/Qt_使用技巧.md @@ -5,6 +5,7 @@ - [2. QT\_DEBUG\_PLUGINS](#2-qt_debug_plugins) - [3. Online Install/MaintenanceTool 加速](#3-online-installmaintenancetool-加速) - [4. MaintenanceTool 添加/删除组件时只显示已安装的组件 或 无法正常升级组件](#4-maintenancetool-添加删除组件时只显示已安装的组件-或-无法正常升级组件) + - [5. Linux Online Install 没有图标](#5-linux-online-install-没有图标) ## 1. -platform @@ -27,12 +28,71 @@ export QT_DEBUG_PLUGINS=1 ## 3. Online Install/MaintenanceTool 加速 ```bash -./qt-unified-windows-x64-online.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt -./qt-unified-linux-x64-online.run --mirror https://mirrors.tuna.tsinghua.edu.cn/qt +# For Windows +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 --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 添加/删除组件时只显示已安装的组件 或 无法正常升级组件 原因是 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; +```