您现在的位置是:网站首页> C/C++
QT 开发IOS
- C/C++
- 2023-07-09
- 872人已阅读
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];
}
下一篇:QT QuickControl2