最近一直在忙mac上的输入法开发,现在终于告一段落了,分享一下开发时遇到的问题和经验。

开发语言:

C,c++,object-C

开发工具:

QtCreator 2.4.1

Qt SDK 4.8.0

Xcode 3.2.6

环境搭建:

参考:

http://mobile.51cto.com/symbian-269099.htm

打开Qtcreator,创建一个新工程,build,成功,环境搭建完毕!

qt-creator-mac-opensource-2.4.1.dmg

qt-mac-opensource-4.8.0.dmg

qt-mac-opensource-4.8.0-debug-libs.dmg

输入法机制:

Mac上开发时需要遵循mac的输入法机制。以便可以调用送字的功能。(使用apple script貌似也能实现?)

下载mac输入法的官方sample,叫NumberInput_IMKit_Sample

地址:

http://developer.apple.com/library/mac/#samplecode/NumberInput_IMKit_Sample/Introduction/Intro.html

在xcode的sdk里搜索InputMethodKit

也可以找到这个sample。

下面简单说明一下mac的输入法机制。


A.实现IMKInputController 

继承此类后,可以重载/调用输入法的功能函数,比如送字,提交候选等,具体可以参考InputMethodKit.h(系统文件,搜索查看)

B.实现注册

//Eachinputmethodneedsauniqueconnectionname.

//Notethatperiodsandspacesarenotallowedintheconnectionname.

constNSString*kConnectionName=@"NumberInput_1_Connection";

//letthisbeaglobalsoourapplicationcontrollerdelegatecanaccessiteasily

IMKServer*       server;

server=[[IMKServeralloc]initWithName:(NSString*)kConnectionNamebundleIdentifier:[[NSBundlemainBundle]bundleIdentifier]];

通过指定输入法的服务名称,来通知系统,告诉他现在我的这个app是输入法程序,这样就可以调用A中的函数了。如果不通知系统,是无法使用输入法函数的。因为系统为每个输入焦点都分配一个inputSession,如果不注册,则无法获取当前的焦点id。

C.重要接口说明

A中说了要调用输入法的功能,需要继承那个IMKInputController类。

.h

#import <Cocoa/Cocoa.h>
#import <InputMethodKit/InputMethodKit.h>
@interface NumberInputController : IMKInputController {
NSString *m_szScript;
}

.mm

这个inputText函数就是拦截当前输入的内容(比如你按下键盘按键),来决定是否将指定的字符串发送到当前焦点上。sender是当前焦点的控件,id类型是objectC里特有的,可以指向任何类型,但是不等同于void*。

返回NO的话,按键事件不会发给焦点窗口,true的话就会发送上去。

-(BOOL)inputText:(NSString*)string client:(id)sender
{//Return YES to indicate the the key input was received and dealt with.  Key processing will not continue in that case.  In//other words the system will not deliver a key down event to the application.//Returning NO means the original key down will be passed on to the client.NSLog(@"inputText:%@, sender:0x%x", string, sender);return NO;
}
commitComposition是将完成的复合结果提交上屏,里面的inserText实际上是重点函数,这个函数是将指定字符串发送到当前焦点id上。这里我将hello这个字符串发送到了当前屏幕上。
-(void)commitComposition:(id)sender
{NSLog(@"commitComposition--sender:0x%x", sender);[sender insertText:@" hello " replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
}
也许你会好奇这个id是怎么来的,因为inputText和commitComposition都是重写的系统函数,id是系统传进来的,如果在自己的程序里怎么能够不通过触发这两个函数来获取当前的id呢?我们来看这两个函数:
/*!@method@abstract   Activates the input method.
*/
//激活输入法,只要将输入法放在系统目录,一有焦点切换就会进入这里
- (void)activateServer:(id)sender
{
NSLog(@"---NumberInputController activateServer sender:0x%x---", sender);
}

/*!@method@abstract   Deactivate the input method.
*/
//和activateServer不同,deactivateServer只会在切换到别的输入法或者在焦点间切换时才会调用
- (void)deactivateServer:(id)sender
{
}

呵呵,现在是不是知道怎么做了?没错,在active的时候将sender记录下来,这样就可以全局使用啦~~~~

D.修改plist文件

CFBundleIdentifier(com.jt.inputmethod.QTestInput)
是服务的名字,这里面必须包含inputmethod字符,不然系统不会认定是输入法服务。
NSMainNibFile(MainMenu)
是nib文件的名字,注意统一。
NSPrincipalClass(NSApplication)
输入法其实也是一个application
LSBackgroundOnly(1)
这个也很重要,设定为1,这样就是一个后台运行的app,doc栏中不会有程序的icon。
InputMethodConnectionName(NumberInput_1_Connection)
输入法机制里B的那个变量,注册时使用的名字。要和代码中统一。
InputMethodServerControllerClass
InputMethodServerDelegateClass
目前注册这两个类时,这里面填写的是类名,目前使用的都是NumberInputController这个类。
至于这两个类都注册成同一个class,就是为了将这两个系统类的方法都在NumberInputController中调用。他们分别控制着系统输入法里相关的一些函数,不明白可以参考InputMethodKitOverview.pdf,实在不理解就pass吧。
tsInputMethodIconFileKey
在设置里显示的icon的文件名
CFBundleIconFile
App的icon图片文件名

E.打包发布

Pkg是mac上一般常见的安装包文件,类似setup.exe。
使用xcode自带的packageMaker工具,具体使用可以google一下。将打好依赖库的app直接拖到packageMaker里,然后Build后会生成对应的pkg文件。
编译生成的app是没有加入依赖库的(就是.pro文件里那些framework),最终发布时,程序可能要在裸机上跑,那些没有环境的设备上,因此就要将依赖库打包进来。
使用qt自带的工具,macdeployqt,该工具在Deverloper/Tools/Qt目录下。
运行时这样:
macdeployqt xxx/xxx.app –verbose=2
具体可以-h显示参数。
打依赖库:
macdeployqt xxx/xxx.app –verbose=2
打dmg
macdeployqt xxx/xxx.pkg  –verbose=2 –dmg
会有错误,不用管它。

F.调试

将编译生成的app文件放在/Users/mini/library/Input Method下,然后打开系统偏好设置,进入语言和键盘,最右侧的tab里可以选择输入法,将你的输入法名字勾选即可。
随意打开一个编辑框,然后command+space切换到Qinput即可呼出输入法界面。
程序中通过NSLog,qDebug函数打印日志,调试程序。





												

mac上使用qt,进行输入法的开发相关推荐

  1. 在Mac上使用idea搭建flink java开发环境

    1.环境 本文档记录的是使用flink的java API简单地创建应用的过程. 前置条件:需要安装Java.maven和flink. 1.1 Java环境变量 Java需要jdk.path.class ...

  2. mac上用qt调用自己生成的qt动态库,该动态库又依赖第三方库

    qt下依赖于第三方库生成的动态库的调用 概述 基于声网的sdk如何在自己的动态库中使用 使用基于第三方库的动态库 下面看pro文件中的设置 概述 初次使用mac上的qtCreator生成动态库,该动态 ...

  3. s3c2410上搭建QT/Embedded4.8.5开发环境(四)--安装intel-x86 X11平台qt库qt-everywhere-opensource-src-4.8.5...

    [目标板]s3c-2410 [虚拟机]CentOS6.4 kernel-2.6.32 [编译器]gcc-4.4.6 目前QT官网的4.8.5的几个版本中Qt libraries 4.8.5 for L ...

  4. Mac上编译Qt源码教程

    一.下载Qt安装包 此处推荐5.12.9版本 下载链接: 链接: https://pan.baidu.com/s/1X-7uePfAIY2psDR4X9F8gg密码: bgjo 原因:因为我自己用的是 ...

  5. 最好用浏览器_魔镜魔镜,请你告诉我谁是Mac上最好用的浏览器?--全网最好用的12个功能让你玩转Safari...

    Safari是苹果自带原生浏览器,无论是iPad.iOS.Mac都将Safari集成在系统中,按道理讲它应该是苹果产品里最好用的浏览器,但是很多小伙伴却觉得Safari不好用,转身投入了其他浏览器的怀 ...

  6. Mac上深色模式下的精美炫酷软件

    针对发布的 macOS Mojave 10.14 系统中,最大的改变就是引入了深色模式,尤其对技术开发人员来说非常实用,非常的酷! 深色模式使用一种较深的配色方案,这种配色作用于整个系统,包括 Mac ...

  7. 如何在M1 Mac上安装iPhone或iPad应用程序

    苹果公司的M1 Macs由苹果公司设计的基于Arm的芯片提供支持,由于不同操作系统之间的通用架构,因此能够运行iOS和iPadOS应用程序. 一些iOS开发人员一直在更新其应用程序以使其与macOS兼 ...

  8. [转] 在Mac上搭建React Native开发环境

    原文链接: http://blog.csdn.net/xiangzhihong8/article/details/53914336 概述 前面我们介绍过在window环境下开发React Native ...

  9. mac+php7+mysql.so_在Mac上编译安装PHP7的开发环境

    今天看到鸟哥发微博说php7 beta1测试版发布了,于是赶紧就去抢先下载,把自己的开发环境也升级到PHP7去,话不多少,下面就一起来搞起吧... 首先你得去官网下载php7 beta1的版本 这里由 ...

最新文章

  1. 【转】C++中this指针的用法详解
  2. Web后端语言模拟http请求(带用户名和密码)实例代码大全
  3. 【qduoj】C语言课程设计_约瑟夫问题
  4. oracle配置ipv6_pl/sql developer通过IPV6连接oracle-阿里云开发者社区
  5. sql 逻辑运算符_SQL Like逻辑运算符介绍和概述
  6. 年总结(五):再次突破自我的半年(2016.3—2016.9)
  7. clr错误 8004005程序将立即终止_微软公开发布更多Surface驱动程序 固件支持终止日期...
  8. 微软职位内部推荐-Software Engineer
  9. spring boot demo( 获取一个RESTful web service)
  10. 信息系统项目的应急预案方案_【学习】环评、验收、排污许可证、应急预案,都应在项目什么阶段开展?...
  11. 通过url链接登录其他系统
  12. 《数学分析新讲》_张筑生,12.5节:隐函数定理(1)
  13. linux安装p12,用命令行安装mobileprovision和p12证书
  14. STM32入门笔记(02):麦克纳姆轮、TB6612电机驱动、PID电机控制和编码器学习记录
  15. 均方根误差,平均绝对误差,均方误差,标准差计算方法
  16. 网络隔离下的几种数据交换技术比较
  17. 取回Apple TV遥控器的D-Pad
  18. java游戏回转贝贝龙2下载,崩坏3:暴雨将至最后的剧情,为何贝贝龙拼死保护琪亚娜...
  19. Unity各个坐标轴
  20. set name utd8_ml utd 8机器学习数据的最新生命

热门文章

  1. VisionPro脚本Simple与Advanced
  2. ansys经典界面分析工字钢_ansys工字钢实例分析.doc
  3. 树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
  4. Windows还原系统后分区合并为一个分区恢复方法
  5. 测坐标天幕靶软件设计_测速天幕靶检定装置与检定方法
  6. Android 详解第三方介质交互之NFC,并且实现读你的交通卡,酒店房卡,学生证!
  7. HTML怎么把按钮往下移,css按钮固定在底部
  8. C++五子棋源码(Qt版)
  9. 夜光 :AGV 导航策略总体方案设计
  10. 设计模式七大原则总结