Qt:5.7虚拟键盘中拼音输入法的使用



  • 引言

    在Qt5.7中,以前只有企业版才有的虚拟键盘,终于可以在开原版中使用了。

    但是默认的Qt安装包,安装出来的虚拟键盘,是不包含拼音输入法的,这里我来说下怎么打开拼音的支持,以及使用了虚拟键盘后,项目如何部署。

    请注意

    • 我使用的环境是Qt5.7.0和VS2013 32bit,若你是MinGW,请注意部分命令是不同的
    • 本教程不包含虚拟键盘本身使用的使用教程
    • 使用的工程为示例中的Qt Quick Virtual Keyboard - Basic Example

    开启拼音输入法

    • 下载Qt源码

      http://download.qt.io/official_releases/qt/5.7/5.7.0/single/qt-everywhere-opensource-src-5.7.0.zip

    • 解压源码

    • 找到虚拟键盘源码的目录 qtvirtualkeyboard ,并且拷贝到桌面

      为什么要放到桌面,因为桌面的目录结构比较简单,没有特殊符号。我一开始因为放在了一个特殊路径下,导致install有问题,找了很久才发现是目录问题

    • 打开Qt的命令行工具

      左下角菜单,Qt5.7.0,里面的命令行工具

      对于我而言,我使用的是 Qt5.7.0 32-bit for Desktop (MSVC 2013) 这个

    • 依次输入以下命令并且执行

      • cd %UserProfile%\Desktop\qtvirtualkeyboard\

      • qmake CONFIG+="lang-en_GB lang-zh_CN"

    • 关闭Qt的命令行工具,打开VS的命令行工具

      左下角菜单,Visual Studio 2013,里面的命令行工具

      对于我而言,我使用的是 VS2013 x86 Native Tools Command Prompt 这个

    • 依次输入以下命令并且执行

      • cd %UserProfile%\Desktop\qtvirtualkeyboard\

      • nmake

      • nmake install

    • 运行并运行示例

      • 打开 QtCreator

      • 在示例中找到 Qt Quick Virtual Keyboard - Basic Example 这个例子

      • 编译运行

    • 查看效果

      0_1474968715323_无标题.png

    发布带有虚拟键盘的项目

    • 对于虚拟键盘,除了exe本身需要的基础dll(例如Qt5Core.dll)以外,还需拷贝以下内容到exe目录

      • %Qt安装目录%/vs2013/bin目录中的Qt5Svg.dll

      • %Qt安装目录%/vs2013/plugins目录中的platforminputcontexts文件夹

      • %Qt安装目录%/vs2013/plugins目录中的imageformats文件夹

      • %Qt安装目录%/vs2013/qtvirtualkeyboard文件夹

    • 然后在exe目录下,新建名为 qt.conf 的文件,在里面输入内容并保存

      [Paths]
      Prefix=.
      
    • 发布目录文件结构

      0_1474968708878_捕获.PNG


  • 网站研运

    @JasonQt:5.7虚拟键盘中拼音输入法的使用 中说:

    qmake CONFIG+="lang-en_GB lang-zh_CN"

    强有力支持啊。看来核心就在于使用locale了。



  • 给力的楼主,支持~!



  • @jcy 高级配置 顶级配置 描述 讲话
    disable-desktop n /一个 禁用桌面集成 默认情况下,启用桌面集成目标环境时X11或Windows桌面。 使用这个选项,桌面集成可以被禁用。
    注意: 对于嵌入式集成的 InputPanel instantitated由应用程序,不需要显式地使用这个选项。 虚拟键盘不会创建桌面应用程序创建输入面板 InputPanel 之前的重点是将一个输入字段。
    disable-xcb n /一个 禁用X11集成
    注意: 1.3以来弃用。 使用 disable-desktop 代替。
    disable-hunspell n /一个 禁用Hunspell集成 Hunspell启用集成如果Hunspell库可用系统,或者使用当地的项目文件。 集成可以使用这个选项被禁用。
    静态 使静态构建的虚拟键盘 这个选项允许静态构建。
    “复古”方式 n /一个 让复古的风格 更改默认键盘风格的复古风格。 两种风格仍然包含在包中,但这个选项允许你改变内置的默认风格。
    拼音 lang-zh_CN 支持简体中文的拼音输入法。 这个选项激活语言简体中文的拼音输入法。
    tcime lang-zh_TW 使Cangjie和注音输入中国的传统方法。 这个选项激活Cangjie和传统汉语注音输入法。
    cangjie lang-zh_TW 中国传统使Cangjie输入方法。 这个选项激活Cangjie传统中文输入法。
    注音 lang-zh_TW 使中国传统的注音输入法。 这个选项激活中国传统的注音输入法语言。
    韩语 lang-ko_KR 使韩国的韩语输入法。 这个选项激活韩国的韩语输入法语言。
    openwnn lang-ja_JP 使 OpenWnn 日本的输入方法。 这个选项激活 OpenWnn 日语输入法。
    lipi-toolkit 笔迹 支持手写输入法使用Lipi工具包。 手写识别是基于开源Lipi工具包。
    t9write 笔迹 允许使用T9写手写输入法。 手写识别是基于商业T9写产品从细微的通信。


  • 网站研运

    @richards 我们目前暂时用不到呢。



  • 请问题主在linux下部署过吗?我在linux下部署之后没有拼音输入法。编译过程完全是参照题主的。windows下是有拼音输入法的。



  • @York 好像是拥有拼音输入法的,在Qt 5.7以后就可以使用了。你们可以尝试一下。



  • @jiangcaiyang 大神你好!我用的是Qt5.6 ,源码实在github上下载的。https://github.com/qt/qtvirtualkeyboard/tree/5.6
    linux下可以英文输入,但是没有中文。



  • @York 要5.7,要不你试试5.7看看呢?


Log in to reply
 

走马观花

最近的回复

  • C

    Qt for MCU需要商业授权的

    read more
  • Qt for MCUs

    搭建Qt for MCUs PC端开发环境。qt for mcus提供了一个完整的图形框架和工具包,包含了在MCUs上设计、开发和部署gui所需的一切。它允许您在裸机或实时操作系统上运行应用程序。

    先决条件

    开发主机环境支持仅限于Windows 10

    MSVC compiler v19.16 (Visual Studio 2017 15.9.9 or newer) x64

    CMake v3.13 or newer (you can install it using the Qt Online installer) x64

    使用Qt联机安装程序安装Qt for MCUs,该安装程序可通过Qt帐户下载

    安装Qt 5.14和Qt Creator 4.11 or higher

    安装链接

    › Qt: https://account.qt.io/downloads
    › CMake: https://cmake.org/download/
    › Python 2.7 32-bit: https://www.python.org/downloads/release/python-2716/
    › Arm GCC: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnutoolchain/gnu-rm/downloads
    › J-Link Software Pack: https://www.segger.com/downloads/jlink/JLink_Windows.exe
    › J-Link OpenSDA Firmware: https://www.segger.com/downloads/jlink/OpenSDA_MIMXRT1050-EVKHyperflash
    › STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html
    › STM32 ST-LINK Utility: https://www.st.com/en/development-tools/stsw-link004.html​​​​​​​

    Qt Creator设置 启用Qt Creator插件 选择“帮助>关于插件”,然后从列表中选择“MCU支持(实验性)”插件,重新启动Qt Creator以应用更改
    替代文字 为MCU创建Qt工具包

    选择工具>选项>设备>MCU

    选择Qt for MCUs-Desktop 32bpp作为目标

    如果尚未设置,请提供Qt for MCUs安装目录的路径。

    单击Apply应用。

    替代文字

    替代文字
    替代文字

    注意:

    编译器要选X64,Qt版本要选64bit,CMake Tool选x64

    打开恒温器项目demo

    选择文件>打开文件或项目。。。

    打开CMakefiles.txt文件来自thermo文件夹的文件。

    选择Qt作为MCU-桌面32bpp套件。

    单击“配置项目”以完成。

    替代文字

    问题

    开发主机环境支持仅限于Windows 10

    C++编译失败,文本大字体.pixelSize.

    文本类型无法正确呈现需要复杂文本布局的unicode序列。对复杂文本使用StaticText

    read more
  • H

    hi 有问题请教你,方便加个联系方式吗

    read more
  • boost.asio是一个很棒的网络库,这回儿我也开始系统地学习起来了。想想当年接触boost,也有八年多了。这次开始接触boost,觉得既熟悉又陌生。熟悉的是小写字母+下划线的命名方式、晦涩的模板、很慢的编译速度以及较大的程序体积,陌生的是asio的各种概念:io服务、接收器、套接字等等:我之前对网络编程不是非常了解。

    于是根据我的理解,参考《Boost.Asio C++网络编程》实现了这样一个简单的客户端和服务端通信的例子,例子非常简单,还不完善,但是幸运的是,可以在本机上互通了。
    下面是客户端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void writeHandler( const boost::system::error_code& ec, size_t bytesTransferred ) { if ( ec ) { cout << "Write data error, code: " << ec.value( ) << "transferred: " << bytesTransferred << endl; } else { cout << "OK! " << bytesTransferred << "bytes written. " << endl; } } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::socket sock( service ); ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; sock.connect( ep, ec ); if ( ec ) { cout << "Connect error, code: " << ec.value( ) << ", We will exit." << endl; return ec.value( ); } else { char buf[1024] = "Hello world!"; sock.async_write_some( buffer( buf ), writeHandler ); sock.close( ); } return service.run( ); }

    下面是服务端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void acceptHandle( const boost::system::error_code& code ) { cout << "Accepted." << endl; } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; ip::tcp::socket sock( service ); ip::tcp::acceptor acceptor( service, ep ); acceptor.async_accept( sock, acceptHandle ); if ( ec ) { cout << "There is an error in server. code: " << ec.value( ) << endl; } return service.run( );// 阻塞运行 }

    运行结果是这样的:
    78448d7b-b3ae-42fc-9e2e-4dd2fbdac2c2-image.png

    我对boost.asio中几个概念的理解:

    io_service,这就是一个类似事件循环的东西,它为io设备提供服务,故名。不管是套接字、文件还是串口设备,都要使用它的服务。它的run()函数相当于启动了一个事件循环。一旦有消息了,即进行响应。这也是实现异步编程的重要基础。 socket,这个类则是套接字,可以处理TCP或者是UDP请求。有同步以及异步的处理方式,也有带异常以及不带异常的处理方式。 acceptor,接收器,仅仅是服务端使用。相当于其余框架中的listener,作接收用的。

    比较浅显,如果有不当之处,敬请指正。

    read more

关注我们

微博
QQ群