2011-07-03 18 views
7

Uygulamam için özel bir URL düzeni uygulamaya çalışıyorum. Info.plist için gerekli satırları ekledim. Belirtilen URL'yi çağırdıktan sonra (örneğin: myapp: //) uygulama başlatılır. URL şeması - Qt ve mac

Ben URL'yi işlemek istiyorsanız

, Bu adımları tespit ettik:

@interface EventHandler : NSObject { 
} 
@end 

@implementation EventHandler 
- (id)init { 
    self = [super init]; 

    if (self) { 
     NSLog(@"eventHandler::init"); 

     NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; 
     [defaultCenter addObserver:self 
         selector:@selector(applicationDidFinishLaunching:) 
//      name:NSApplicationWillFinishLaunchingNotification 
      name:NSApplicationDidFinishLaunchingNotification 
         object:nil]; 
    } 
    return self; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager]; 
    [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 
} 

- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent 
{ 
    NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; 
    NSLog(@"%@", url); 
} 

@end 

uygulama çalışıyorsa yukarıdaki kod çalışıyor ama URL çağrılan ve uygulama sonlandırıldı eğer, olay yakalanmadı. Bunun nedeni şudur: NSApplicationDidFinishLaunchingNotification. NSApplicationWillFinishLaunchingNotification olarak değiştirilmesi, olay dışı olayların yakalanmasına neden olur. Belki Qt benden önce işler, ancak sorun için bir çözüm bulamıyorum.

+0

O dinleme görünüyor NSApplicationDidBecomeActiveNotification bildirimi sorunu çözer. Bunun en iyi yol olduğunu düşünmüyorum, bu yüzden daha iyi fikirler için soruyu açık bırakıyorum :) – birmacher

cevap

4

Ayrıca, Qt tabanlı uygulama tanıtıcımı Mac'te özel bir URL şeması almaya ve orijinal posterle aynı yola düştüm. Qt4'ün Mac’te zaten URL olaylarını desteklediğini ve bunları almak için Objective-C kodunu yazmaya gerek olmadığını ortaya koyuyor. Bu, gerçekte NSApplicationWillFinishLaunchingNotification'a yanıt olarak olay işleyicisini ayarladığınızda hiçbir URL olayı almamanın nedeni: Qt daha sonra kendi işleyicisini kaydeder.

Özel şemanızla bir URL tetiklendiğinde, Qt uygulamanıza bir FileOpenEvent verilir. Etkinliği alan QApplication örneğinin olduğunu unutmayın. Uygulamanızı alt sınıf QApplication yaparak veya standart QApplication üzerine bir olay filtresi yükleyerek yakalayabilirsiniz. Bu ikinci yaklaşımı seçtim.

Özel etkinlik filtresi sınıfım FileOpenEventFilter öğesinin eventFilter yöntemi. Etkinlik, boş olmayan bir URL içerdiğinde, sadece URL'yi gönderir. Bu da benim ana penceresi tamamen olay geldiğinde başlatılmadı durumunda son açılan URL'yi kaydeder (özel URL tıklandığında çalışmıyorsa ne zaman Uygulamamda olur ki.)

bool FileOpenEventFilter::eventFilter(QObject* obj, QEvent* event) 
{ 
    if (event->type() == QEvent::FileOpen) 
    { 
     QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event); 
     if (!fileEvent->url().isEmpty()) 
     { 
      m_lastUrl = fileEvent->url().toString(); 
      emit urlOpened(m_lastUrl); 
     } 
     else if (!fileEvent->file().isEmpty()) 
     { 
      emit fileOpened(fileEvent->file()); 
     } 

     return false; 
    } 
    else 
    { 
     // standard event processing 
     return QObject::eventFilter(obj, event); 
    } 
} 
1

İşleyicimi uygulama temsilcisine applicationWillFinishLaunching: yönteminde kaydediyorum ve herhangi bir olayı kaçırmıyorum. Bu bildirimi almak için muhtemelen EventHandler nesnesini çok geç başlatıyorsunuz. Bunu ayrı bir sınıf olarak tutmak istiyorsanız, sorun değil, ancak nesnenizi oluşturmalı ve uygulama temsilcinizin applicationWillFinishLaunching: yönteminde ile kaydetmelisiniz.