in someheader.h (to be #included on the Qt/C++ side):
#include <QObject>
namespace SomeNamespace {
struct SomeViewControllerImpl;
class SomeWrapper : public QObject
{
Q_OBJECT
SomeViewControllerImpl* impl;
public:
SomeWrapper();
~SomeWrapper();
// some other functions ...
private:
void onSomeEvent(Foo someParameter); // callback function
signals:
void someEvent(Foo foo);
};
} // namespace SomeNamespace
in .mm implementation file:
#include "someheader.h"
#include <functional>
@interface SomeViewController : UIViewController <SomeViewDelegate>
// ...
@property (nonatomic, assign) std::function<void(Foo someParameter)> someCallback;
// ...
@end
@implementation SomeViewContoller
// ...
- someEvent {
Foo value = ... ;
// call the callback:
if(self.someCallback != nil) {
self.someCallback(value);
}
}
// ...
@end
namespace SomeNamespace {
struct SomeViewControllerImpl
{
SomeViewController* someViewController;
};
// C++ wrapper Implementation
// constructor:
SomeWrapper::SomeWrapper() : impl(new SomeViewControllerImpl) {
UIViewController* rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
NSLog(@"View controller loaded.");
impl->someViewController = [[SomeViewController alloc] init];
@try {
NSLog(@"Starting SomeViewController ...");
// ...
// present SomeViewController:
[rootController presentViewController:impl->someViewController animated:YES completion:nil];
// register the callback (capture member function, this pointer and an arg):
[impl->someViewController setSomeCallback:(std::bind(&SomeWrapper::onSomeEvent, this, std::placeholders::_1))];
}
@catch (NSException *exception) { // ... }
}
SomeWrapper::~SomeWrapper() {
if(impl) {
[impl->someViewController release];
}
delete impl;
}
void SomeWrapper::onEvent(Foo foo) {
emit someEvent(foo);
}