2011-04-28 4 views
5

Qt proyecto en Mac OS X. Necesito mostrar la ventana de notificación en la parte superior sin robar un foco de ninguna aplicación activa.Ventana de notificación en Mac. Con o sin Qt

Aquí la parte constructor de widgets:

setWindowFlags(
    Qt::FramelessWindowHint | 
    Qt::WindowSystemMenuHint | 
    Qt::Tool | 
    Qt::WindowStaysOnTopHint 
); 
setAttribute(Qt::WA_TranslucentBackground); 

Qt::WA_ShowWithoutActivating no afecta a nada.

¿Hay alguna manera de hacerlo? Estoy listo para implementar la solución nativa de carbono/cacao allí, pero se prefiere Qt. ¿O tal vez estoy equivocado en la filosofía de Mac y debo notificar al usuario de una manera diferente?

Actualización Growl no es compatible con la línea del editor en sus notificaciones, ¿o sí?

+1

Si [Growl] (http://growl.info) es una opción, lo recomendaría. Se ha convertido en el estándar de facto para las notificaciones en OS X. – zneak

+0

¿Qué es una línea de editor? –

+0

@Bavarious QLineEdit por ejemplo –

Respuesta

6

¡Lo hice!

#ifdef Q_OS_MAC 
#include <Carbon/Carbon.h> 
#endif 

NotifyWindow::NotifyWindow() : QWidget(0 /* This zero is the first point */) { 

    setWindowFlags(
    #ifdef Q_OS_MAC 
     Qt::SubWindow | // This type flag is the second point 
    #else 
     Qt::Tool | 
    #endif 
     Qt::FramelessWindowHint | 
     Qt::WindowSystemMenuHint | 
     Qt::WindowStaysOnTopHint 
    ); 
    setAttribute(Qt::WA_TranslucentBackground); 

    // And this conditional block is the third point 
#ifdef Q_OS_MAC 
    winId(); // This call creates the OS window ID itself. 
      // qt_mac_window_for() doesn't 

    int setAttr[] = { 
     kHIWindowBitDoesNotHide, // Shows window even when app is hidden 

     kHIWindowBitDoesNotCycle, // Not sure if required, but not bad 

     kHIWindowBitNoShadow, // Keep this if you have your own design 
           // with cross-platform drawn shadows 
     0 }; 
    int clearAttr[] = { 0 }; 
    HIWindowChangeAttributes(qt_mac_window_for(this), setAttr, clearAttr); 
#endif 
} 

Nos conseguir casi el mismo comportamiento agradable como en Windows:

  • No robó centrarse en el programa. (Dos semanas de búsqueda en Internet)
  • Los controles controlan el primer clic del usuario, mientras que otras ventanas necesitan un clic adicional para activarse.
  • Cuando se activa la ventana, las otras ventanas de la misma aplicación no brotan hacia el frente.
  • Y un pequeño problema remains, pero al menos tiene una solución simple. O incluso podría ser dejado.
4

Pavel,

¿Has oído hablar de Growl? Growl es una aplicación de notificación MUY impresionante que puedes agrupar y usar con tu aplicación. Adium, una popular aplicación de mensajería instantánea para OS X, lo usa para todas las notificaciones.

http://growl.info/

0

acabo de probar esta banderas

Qt::FramelessWindowHint |Qt::WindowSystemMenuHint |Qt::WindowStaysOnTopHint 

Y

setFocusPolicy(Qt::NoFocus); 
setAttribute(Qt::WA_ShowWithoutActivating,true); 

Sin cacao llamada o código de carbono para las banderas de las ventanas y máscaras. Y notifyWindow funciona como en Windows o Linux.

Cuestiones relacionadas