2013-06-07 9 views
5

Mam aplikację Qt, która (z przyczyn wykraczających poza zakres tego pytania) uruchamia każde z jej okien jako oddzielny proces.Wieloprocesorowa aplikacja Qt: Jak mogę ograniczyć ją do pojedynczej ikony w doku MacOS/X?

Działa to dobrze, ale pod MacOS/X każde okno/proces jest wyświetlane jako osobny wpis w Docku. Tak więc, gdy użytkownik ma kilkanaście otwartych okien, w Dockach znajduje się kilkanaście identycznych ikon, co nie jest zbyt pomocne (ponieważ trudno jest określić, które jest, a ikony zaczynają być małe).

Czy jest jakiś sposób, aby powiedzieć Dockowi, aby zgrupować wszystkie te procesy razem pod jedną ikoną Dock? (API dla Maca będzie w porządku)

Odpowiedz

4

Można użyć następującego fragmentu kodu, aby ukryć dachówka dok z procesu, który nie jest aktywny:

- (void)applicationWillResignActive:(NSNotification *)notification 
{ 
    ProcessSerialNumber psn = {0, kCurrentProcess}; 
    TransformProcessType(&psn, kProcessTransformToBackgroundApplication); 
    if([self.window isVisible]) 
    { 
     [self.window performSelector:@selector(orderFrontRegardless) withObject:nil afterDelay:0.05]; 
    } 
} 

- (void)applicationWillBecomeActive:(NSNotification *)notification 
{ 
    ProcessSerialNumber psn = {0, kCurrentProcess}; 
    TransformProcessType(&psn, kProcessTransformToForegroundApplication); 
    SetFrontProcessWithOptions(&psn, kSetFrontProcessCausedByUser); 
} 

Wystarczy dodać powyższy kod do delegata aplikacji i ikona Dock aplikacji zniknie po zakończeniu procesu.
Aby okno było widoczne po przekształceniu procesu w aplikację UIElement, wyślij wiadomość o następującej treści: orderFrontRegardless. (Bardzo hacky, wiem - ale to musi być cena za niestandardowe działanie okna/procesu)

Prawdopodobnie powinieneś również utrzymywać menu Dock, które pozwala użytkownikom wybrać ukryte okna.
Możesz dynamicznie dodawać wpisy z "głównej" aplikacji. Szczegółowe informacje można znaleźć w sekcji Przewodnik po płytkach dokujących w numerze "Dynamically Adding Menu Items With the Application Delegate".

Aktualizacja:
ja lekko zmienił kod przykładowy powyżej jak poprzednie podejście doprowadziło do non-responsive głównego menu po ponownym uruchomieniem aplikacji.

+0

Czy nie spowoduje to również problemu, w którym pasek menu mojego okna zniknie, gdy proces przejdzie w tryb UIElementApplication? –

+0

Nie, ponieważ proces jest automatycznie przekształcany w proces pierwszego planu, gdy tylko aplikacja ponownie stanie się aktywna (np. Przez kliknięcie okna). Będziesz jednak musiał znaleźć rozwiązanie dla zamkniętych/ukrytych okien. Możesz łatwo przetestować zachowanie powyższego kodu, umieszczając go w delegacie aplikacji pustego projektu Xcode. –

+0

Zbudowałem powyższy kod z pustym projektem Xcode ... ikona Docku zniknęła po kliknięciu poza oknem, ale kiedy ponownie ustawiłem okno na ostrości, pasek menu był niefunkcjonalny: mogłem to zobaczyć, ale kliknięcie nie miało żadnego efektu (tzn. menu nie spadło). :( –

1

Zadzwoń pod QSystemTrayIcon::hide().

Jeśli to nie zadziała, oto kilka rzeczy, które można spróbować:


Zastosowanie NSApplication „s setActivationPolicy: metoda

Way 1: [NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

Way 2: [NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];


LUB

Użyj LSUIElement(LSUIElement=1).

Możesz również umieścić to w swoim pliku p: <key>LSUIElement</key> <string>1</string> lub wykonać Qt do it for you.


Istnieją również dyskusja o OSX menu na Qt forums. Ponadto, można spróbować użyć QFocusEvent sprawdzić kiedy aplikacja traci/zyskuje skupić a następnie menu aktualizacji odpowiednio.


Źródła

+0

To nie było coś, co miałem nadzieję, ale myślę, że mogę sprawić, żeby to działało - w szczególności mogę sprawić, aby wszystkie okna były domyślnie ukryte pod Windows-okno (używając Info.plist), a następnie zadzwonić do setActivationPolicy na jednym z nich ... trudnym zadaniem będzie upewnienie się, że ikona dokowania pozostanie po tym, jak jedno okno zostanie zamknięte. Więc jeśli nie pojawi się kolejna (lepsza) odpowiedź następnego dnia lub dwóch, nagrodzę tę nagrodę. –

+0

Och, przeszkadza - technika opisana w moim poprzednim komentarzu ma na celu powstrzymanie ikony okna przed Dockiem, ale ma również efekt uboczny, że zapobiega wyświetlaniu się menu okna, gdy okno ma fokus - zamiast tego pasek menu nadal wyświetla zawartość menu powiązaną z którąkolwiek aplikacją, na której wcześniej się skupił. –

+0

@JeremyFriesner Istnieje kilka dyskusji na temat menu na forach Qt: http://qt-project.org/forums/viewthread/2416. Nie jestem pewien, czy to pomaga. – user2448027

Powiązane problemy