2013-06-07 20 views
5

Tôi đã có một ứng dụng Qt (vì các lý do nằm ngoài phạm vi của câu hỏi này) khởi chạy mỗi cửa sổ của nó như một quá trình riêng biệt.Ứng dụng Qt đa xử lý: Làm thế nào tôi có thể giới hạn nó vào một biểu tượng duy nhất trong MacOS/X Dock?

Tính năng này hoạt động tốt, nhưng dưới MacOS/X, mỗi cửa sổ/quy trình hiển thị dưới dạng một mục nhập riêng trong Dock. Vì vậy, khi người dùng có một tá cửa sổ mở, có một tá biểu tượng giống hệt nhau trong Docks, mà không phải là rất hữu ích (vì thật khó để nói đó là gì, và các biểu tượng bắt đầu để có được nhỏ).

Có cách nào để yêu cầu Dock nhóm tất cả các quy trình này lại với nhau dưới một biểu tượng Dock duy nhất không? (API dành riêng cho Mac sẽ là tốt)

Trả lời

4

Bạn có thể sử dụng đoạn mã sau đây để ẩn ngói Dock của một quá trình đó không phải là hoạt động:

- (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); 
} 

Chỉ cần thêm đoạn code trên để đại biểu ứng dụng của bạn và biểu tượng Dock của ứng dụng sẽ biến mất khi quá trình từ chức hoạt động.
Để giữ cửa sổ hiển thị sau khi quá trình được chuyển thành ứng dụng UIElement, hãy gửi thông báo orderFrontRegardless. (Rất hacky, tôi biết - nhưng đó phải là giá để xử lý cửa sổ/quy trình không chuẩn)

Có lẽ bạn cũng nên duy trì menu Dock cho phép người dùng chọn cửa sổ ẩn.
Bạn có thể tự động thêm mục nhập từ ứng dụng "chính" của mình. Chi tiết có thể được tìm thấy trong phần "Dynamically Adding Menu Items With the Application Delegate" của Hướng dẫn lập trình Tile Dock.

Cập nhật:
Tôi hơi thay đổi mẫu mã trên như cách tiếp cận trước đó dẫn đến một menu chính không đáp ứng sau khi tái kích hoạt các ứng dụng.

+0

Điều này cũng không xảy ra với sự cố khi thanh menu của cửa sổ của tôi biến mất khi quá trình chuyển sang chế độ UIElementApplication không? –

+0

Không, bởi vì quá trình tự động được chuyển đổi thành quy trình tiền cảnh ngay sau khi ứng dụng hoạt động trở lại (ví dụ: bằng cách nhấp vào cửa sổ). Bạn sẽ phải tìm một giải pháp cho các cửa sổ đóng/ẩn mặc dù. Bạn có thể dễ dàng kiểm tra hành vi của mã trên bằng cách đặt nó vào ứng dụng đại biểu của một dự án Xcode trống. –

+0

Tôi đã xây dựng mã ở trên bằng một dự án Xcode trống ... biểu tượng dock biến mất khi tôi nhấp vào bên ngoài cửa sổ, nhưng khi tôi đặt lại cửa sổ, thanh trình đơn không hoạt động: tôi có thể thấy, nhưng nhấp vào nó không có hiệu lực (tức là các menu không thả xuống). :( –

1

Gọi QSystemTrayIcon::hide().

Nếu điều đó không làm việc, đây là một số điều bạn có thể thử: setActivationPolicy: phương pháp


Sử dụng NSApplication 's

Cách 1: [NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

Way 2: [NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];


HOẶC

Sử dụng LSUIElement(LSUIElement=1).

Bạn cũng có thể đặt mã này vào pfile của mình: <key>LSUIElement</key> <string>1</string> hoặc đặt Qt do it for you.


Ngoài ra còn có một số cuộc thảo luận về OSX menu trên Qt forums. Ngoài ra, bạn có thể thử sử dụng QFocusEvent để kiểm tra thời điểm ứng dụng mất/tăng tiêu điểm và sau đó menu cập nhật tương ứng.


Nguồn

+0

Đây không phải là những gì tôi đã hy vọng nhưng tôi nghĩ tôi có thể làm cho nó hoạt động - đặc biệt tôi có thể làm cho tất cả cửa sổ dock-window-hidden theo mặc định (sử dụng Info.plist) và sau đó gọi setActivationPolicy trên chỉ một của họ .... phần khó khăn sẽ được đảm bảo một biểu tượng bến tàu vẫn còn sau khi một cửa sổ được đóng lại. Vì vậy, trừ khi một câu trả lời (tốt hơn) đến cùng trong ngày hôm sau hoặc hai tôi sẽ thưởng cho tiền thưởng này. –

+0

Ồ, bận tâm - kỹ thuật được mô tả trong bình luận trước của tôi hoạt động để giữ biểu tượng của cửa sổ ra khỏi Dock, nhưng nó có tác dụng phụ cũng ngăn các menu của cửa sổ hiển thị khi cửa sổ lấy nét - thay vào đó, thanh trình đơn tiếp tục hiển thị nội dung menu được liên kết với bất kỳ ứng dụng nào trước đó có tiêu điểm. –

+0

@JeremyFriesner Có một số thảo luận về các menu trên diễn đàn Qt: http://qt-project.org/forums/viewthread/2416. Tôi không chắc chắn nếu điều đó giúp, mặc dù. – user2448027

Các vấn đề liên quan