您现在的位置是:网站首页> C/C++

QT 开发IOS

  • C/C++
  • 2023-07-09
  • 872人已阅读
摘要

QT-QML调用IOS原生通讯录




QT-QML调用IOS原生通讯录

主要分为三大步骤:

链接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_OBJECT

public:

    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];

}





Top