mac上使用qt,进行输入法的开发

最近一直在忙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函数打印日志,调试程序。







  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Qt 4.8是一个跨平台的应用程序开发框架,具有丰富的功能和强大的跨平台性能。Qt提供了各种API和工具,使开发者能够轻松地创建具有丰富用户界面和功能的应用程序。 在Qt 4.8中,开发者可以利用Qt输入法框架来开发中文输入法Qt输入法框架提供了一套API,用于处理文本输入和处理输入法相关的功能。开发者可以利用这些API来创建自定义的中文输入法,并集成到他们的应用程序中。 中文输入法开发的主要步骤如下: 1. 设计界面:首先,开发者需要设计输入法的界面。这包括键盘布局、预测输入候选词的显示等。 2. 实现输入法逻辑:开发者需要编写代码来处理用户输入。这包括处理键盘按钮的点击事件和根据用户输入更新预测输入候选词的逻辑等。 3. 集成到应用程序:开发者需要将输入法集成到他们的应用程序中。他们可以使用Qt提供的QWidget或QML来创建一个输入法界面,并在应用程序中显示它。 4. 测试和调试:最后,开发者需要测试输入法的功能,并进行调试以解决任何问题。他们可以使用Qt提供的调试工具来帮助他们进行测试和调试。 总之,Qt 4.8提供了一套强大的输入法框架,使开发者能够轻松地开发中文输入法开发者可以利用Qt的API和工具来设计自定义的输入法界面,并实现输入法逻辑。然后,他们可以将输入法集成到他们的应用程序中,并进行测试和调试。 ### 回答2: 在Qt4.8中进行中文输入法开发的过程中,首先需要了解Qt输入法架构和概念。 Qt输入法架构主要包含了三个关键类:QInputMethod,QInputMethodEvent和QInputMethodQueryEvent。其中,QInputMethod负责管理输入法的状态,提供一些接口用于查询输入法的属性,以及通知Qt应用程序关于输入法的改变。QInputMethodEvent则是用于传递输入法事件的类,包括了输入法的逻辑按键事件和文本输入事件。而QInputMethodQueryEvent则是用于查询输入法相关信息的事件。 在进行中文输入法开发时,首先需要创建一个继承自QInputMethod的子类,用于管理中文输入法的状态。可以通过重写QInputMethod的接口函数,如setInputMethodArea和setInputDirection,实现对输入法状态的控制和参数的设置。通过调用QInputMethod::update(Qt::ImEnabled)函数,可以通知Qt应用程序关于输入法状态的改变。 接下来,需要重写QInputMethod的keyPressEvent函数,以处理输入法逻辑按键事件。在中文输入法中,常见的逻辑按键包括拼音输入法中的拼音字符和候选字选择键,以及笔画输入法中的笔画选择键。可以根据具体的中文输入法需求,实现按键的处理逻辑,并使用QInputMethodEvent::setCommitString函数将最终的文本结果发送给Qt应用程序。 除了处理逻辑按键事件,还需要重写QInputMethod的invokeAction函数,以处理输入法的特殊动作,如切换输入法模式、切换符号等。可以根据输入法的需求,在该函数中实现相应的特殊动作逻辑。 最后,在Qt应用程序中使用QCoreApplication::inputMethod()函数获取当前的输入法对象,并通过connect函数连接输入法对象的相关信号和槽函数,实现与输入法的交互操作。 总之,在Qt4.8中进行中文输入法开发,需要重写QInputMethod的接口函数,处理逻辑按键事件和特殊动作,并与Qt应用程序进行交互。通过合理地运用Qt输入法架构和相关类,可以方便地实现一个完整的中文输入法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值