QT-QML调用IOS原生通讯录

来源:互联网 发布:上海浦东软件协会朱 编辑:程序博客网 时间:2024/05/18 06:27

参考了几个大神的文档后,根据自己这边的需要,觉得大家可能也有可能会需要就整理了这篇文章。

主要分为三大步骤:

链接ios原生库

编写C++类调用ios原生通讯录

qml调用封装的C++类(调通讯录的类)


链接ios原生库
在QT工程pro配置文件中加上如下代码:

这里得特别注意的是,你要调用的ios原生函数或方法是出自哪个类库的,一定要全部添加进去,要不编译就会提示找不到你写的ios函数或方法,另外要讲你写的mm文件路径添加进去

ios{   LIBS += -framework Foundation -framework UIKit -framework Contacts -framework ContactsUI   OBJECTIVE_SOURCES += \        SamsonQt_IOS.mm}

编写C++类调用ios原生通讯录

.h 文件中*这里是c++头文件,由于是配合qml使用,所以信号槽你得换个思路,也就是c++类要给qml返回一个收到结果的信号,而qml调用c++则相当qml发了一个打开的信号给c++类,c++这边就是接收打开这个信号的槽,这个槽里面在去打开ios原生的东西* #include <QObject>#include <QString>class SamsonQt_IOS : public QObject{    Q_OBJECTpublic:    static SamsonQt_IOS *s_contactsPicker;signals://    void contactSelected(const QString nameString);      void returnContactInfo(QString imgpath);public slots:    void show(void);//    void contactSelected(const QString nameString);};#endif // SAMSONQT_IOS_H.mm  *这里其实相当于写ios原生代码,没有做过ios原生的童鞋,可以网上百度ios的对应代码就可以了。这里相当在mm里面吧ios对应的头文件与实现文件放在了一起。*#import <Foundation/Foundation.h>#import <Contacts/Contacts.h>#import <ContactsUI/ContactsUI.h>#import <UIKit/UIKit.h>#import <ContactsUI/CNContactPickerViewController.h>@interface ViewController : UIViewController<CNContactPickerDelegate,CNContactViewControllerDelegate>{    CNContactPickerViewController *picker;}@end@implementation ViewController-(void)showContactPicker{    picker = [[CNContactPickerViewController alloc] init];    [picker setDelegate:(id)self];    UIViewController *rootCtrl = [UIApplication sharedApplication].keyWindow.rootViewController;    [rootCtrl presentViewController:picker animated:YES completion:nil];}-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker{    NSLog(@"取消选择联系人");}-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{    NSString *lastname = contact.familyName;    NSString *firstname = contact.givenName;    NSString *fullNameStr = [NSString stringWithFormat:@"%@%@",lastname,firstname];    NSLog(@"%@",fullNameStr);//重点在这里:将原生代理返回的值转换为对应qt里面的值,这里是将nsstring 转换为了Qstring,具体如何操作,可查看qtapi或度娘.转换好以后,就是发送收到结果的信号给需要的地方了。其实和qt的c++使用没什么区别    QString fullName = QString::fromNSString(fullNameStr);//    emit SamsonQt_IOS::s_contactsPicker->contactSelected(fullName);    emit SamsonQt_IOS::s_contactsPicker->returnContactInfo(fullName);    SamsonQt_IOS::s_contactsPicker = NULL;}@end//这里可千万不要忘记是c++类,需要加上构造函数或实例,并且实现其槽方法,这里同时也是打开ios原生的信号。SamsonQt_IOS *SamsonQt_IOS::s_contactsPicker = NULL;void SamsonQt_IOS::show(void){    SamsonQt_IOS::s_contactsPicker = this;    这里是用id强转后充当原生controller来使用,更深入的原理,大家可以自行研究。    void *context = [[ViewController alloc]init];    [(id)context showContactPicker];}

文章到这里就结束了。有可能还有一些人会不明白,具体的需要大家对跨平台调用的原理弄明白弄懂,这样才会更加容易上手一些。源码地址在下面,可以下载后自己多运行多读代码来自己体会。谢谢。

下载地址:http://download.csdn.net/detail/samson_shu/9790918

0 0
原创粉丝点击