【问题标题】:Sending a message to Mountain Lion notification centre with Core foundation使用 Core Foundation 向 Mountain Lion 通知中心发送消息
【发布时间】:2013-09-19 15:21:31
【问题描述】:

我正在使用 Qt 开发一个守护程序,并希望向 Mountain Lion 通知中心发送消息:-

Qt 似乎缺乏对此的支持,这并不奇怪,因为它不是跨平台的。

如果我使用的是 Cocoa,看起来我会使用带有 NSUserNotification 的 NSUserNotificationCenter 类。

到现在为止,每当我看到一个Foundation类,总是有一个匹配的Core Foundation类,但是好像没有CFUserNotificationCenter,而是有一个 CFUserNotification。

那么,我认为 NSNotificationCenter 是 Cocoa 的用途,是否可以在没有 Cocoa 的情况下向通知中心发送消息?

如果可能的话,请有人用 C 或 C++ 发布代码示例,或者至少指出要使用哪些函数?

【问题讨论】:

    标签: c++ macos qt notifications core-foundation


    【解决方案1】:

    您可以轻松integrate Qt/C++ code with Cocoa/Objective-C。 XCode 支持 Objective-C++,它是 C++ 和 Objective-C 的混合体。这些文件将具有 .mm 扩展名,并使用 OBJECTIVE_SOURCES 变量添加到您的 QMake 项目中(遗憾的是,官方 QMake 文档中没有该变量)。因此,只需将 NSUserNotification 代码直接添加到 C++ 类中即可。

    QMake 项目文件

    HEADERS += Foo.h
    OBJECTIVE_SOURCES += Foo.mm
    LIBS += -framework Foundation
    INCLUDEPATH += /System/Library/Frameworks/Foundation.framework/Versions/C/Headers
    

    Foo.h

    #ifndef FOO_H
    #define FOO_H
    class Foo {
    public:
      void test();
    };
    
    #endif
    

    Foo.mm

    #include "foo.h"
    #include <NSUserNotification.h>
    
    void Foo::test() {
      NSUserNotification *userNotification = [[[NSUserNotification alloc] init] autorelease];
      userNotification.title = @"My Great Title";
      userNotification.informativeText = @"Blah Blah Blah";
    
      [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification];
    }
    

    【讨论】:

    • 哇,这很简单。我认为将 Objective C 与 Qt 混合只会在 XCode 中变得简单,但 Qt Creator 也能处理它。谢谢。
    【解决方案2】:

    不需要本机代码。 QSystemTrayIcon::showMessage() 在 10.9.5 (Qt 5.3.2) 中按预期工作。

    QSystemTrayIcon tray_icon;
    auto menu = new QMenu;
    tray_icon.setContextMenu(menu);
    tray_icon.show();
    tray_icon.showMessage("Test message", "Test body");
    

    【讨论】:

    • 抱歉不一样。问题涉及向通知中心发布消息,这可以从任何应用程序完成,而不仅仅是那些带有系统托盘图标的应用程序。这些消息是不同的。
    • 我不明白区别。这些消息会出现在我的通知中心,就像来自任何其他应用程序的消息一样。
    • 它们可能会出现在通知中心,但您的代码需要 QSystemTrayIcon,因此仅适用于该礼物。
    • 图标本身不需要存在 - 只需删除对 QSystemTrayIcon::show() 的调用即可。或者你是说因为你正在开发一个守护进程,所以你不想包含QtGui
    • 不,守护进程无关紧要,因为它无法显示 UI。在这种情况下创建一个 QSystemTrayIcon 只是为了显示消息而不使用系统托盘图标有点矫枉过正。另外,您不能使用这种方法设置调用应用程序的图标,因此并不理想。但是,您说得对,它可以用于基本消息。
    猜你喜欢
    • 2012-07-31
    • 2012-08-25
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多