Окно уведомлений в Mac.С или без Qt - PullRequest
5 голосов
/ 28 апреля 2011

Проект Qt в Mac OS X. Мне нужно показать окно уведомлений сверху без кражи фокуса из любого активного приложения.

Здесь часть конструктора виджета:

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

Qt :: WA_ShowWithoutActivating ни на что не влияет.

Есть ли способ сделать это?Я готов внедрить нативное решение Carbon / Cocoa, но Qt предпочтительнее.Или, может быть, я ошибаюсь в философии Mac и должен уведомить пользователя другим способом?

Обновление Growl не поддерживает строку редактора в своих уведомлениях, не так ли?

Ответы [ 4 ]

6 голосов
/ 01 мая 2011

Я сделал это!

#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
}

Мы получаем почти такое же хорошее поведение, как в Windows:

  • Это не украло фокус на шоу. (Две недели поиска по интернету)
  • Элементы управления обрабатывают первый щелчок пользователя, в то время как для других окон требуется дополнительный щелчок для активации.
  • Когда окно активируется, другие окна того же приложения не всплывают вперед.
  • И небольшая проблема остается , но, по крайней мере, имеет простой обходной путь. Или даже может быть оставлен.
4 голосов
/ 28 апреля 2011

Павел,

Вы слышали о рычании? Growl - ОЧЕНЬ впечатляющее приложение для уведомлений, которое вы можете связать и использовать со своим приложением. Adium - популярное приложение для обмена мгновенными сообщениями для OS X - использует его для всех уведомлений.

http://growl.info/

0 голосов
/ 04 января 2013

Я просто проверяю эти флаги

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

И

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

Без вызова кода Какао или Углерода для оконных флагов и масок. И notifyWindow работает как в Windows или Linux.

0 голосов
/ 28 апреля 2011

Вы можете реализовать Growl.http://growl.info/documentation/developer/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...