适用于 C++ 的 Unity 启动器 API

适用于 C++ 的 Unity 启动器 API

我正在尝试使用 QT SDK 在 QT 中开发一些程序。昨天我读到Unity 启动器 API在官方 ubuntu 网站上。但只有 Vala 和 python 的示例。可以使用 C++ 语言使用 Unity Launcher API(快速列表、计数器和进度条),如果可以的话,请发布一个示例。

答案1

我也在学习 Qt,并试图找到一种在 Qt 中使用 Unity API 的方法,我只能使用 Dbus API,但没有使用 Quicklist,因为它需要一个 DbusMenu,而我不知道如何实现它(仍在学习:))。

这是我为自己创建的示例,希望对其他人有用。也许 Unity 开发人员可以帮助纠正/修复/添加新代码(快速列表) :)

/*
    Unity Launcher Dbus API exmable for Qt
    foxoman [gplus.to/foxoman][[email protected]]

    https://wiki.ubuntu.com/Unity/LauncherAPI#Low_level_DBus_API:_com.canonical.Unity.LauncherEntry

    First step : add this line to your Qt project file .pro
     QT       += dbus
*/

/* I will run this example as Qt console apps */
#include <QtCore/QCoreApplication>

/* Include Qt Dbus required */
#include <QtDBus>

// Qt Main Method
int main(int argc, char *argv[])
{


    /* Qt console Main Loop [ in GUI application the Main loop is QApplication ]
        Unity API need Main Loop to run */
    QCoreApplication a(argc, argv);


    /* Create Qt Dbus Signal to send Dbus Message to unity Dbus API
        signal com.canonical.Unity.LauncherEntry.Update (in s app_uri, in a{sv} properties)
    */
    QDBusMessage signal = QDBusMessage::createSignal(
     "/", /* Path */
     "com.canonical.Unity.LauncherEntry", /* Unity DBus Interface */
     "Update"); /* Update Signal */


    /* app_uri
       Desktop ID ex: firefox -> need to be pined in the launcher to see the effect
    */
    signal << "application://firefox.desktop";


    /* properties : A map of strings to variants with the properties to set on the launcher icon */
    QVariantMap setProperty;

    /* A number to display on the launcher icon */
    setProperty.insert("count", qint64(80));

    /* show count */
    setProperty.insert("count-visible", true);

    /* progress bar count must be float between 0 and 1 (mean from 0.00 to 0.100)*/
    setProperty.insert("progress", double(0.80));

    /* show progress bar */
    setProperty.insert("progress-visible", true);

    /* Tells the launcher to get the users attention  */
    setProperty.insert("urgent",true);

    /* Pack the properties Map to the signal */
    signal << setProperty;

    /* Send the signal */
    QDBusConnection::sessionBus().send(signal);


    return a.exec();
}

点击此处下载示例 http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

答案2

目前没有专门用于从 Qt C++ 访问启动器功能的库。有一个 libunity 库,但它主要面向 glib,因此相对不适合 Qt。正如另一个答案中提到的,与启动器集成的最便捷方法是使用低级 dbus API

如何与启动器集成的基本概念是向启动器发送一个带有应用程序 ID 和一组属性的信号。应用程序 ID 是 .desktop 文件的文件名,通常存储在/usr/share/applications

//create the signal
QDBusMessage signal = QDBusMessage::createSignal("/", 
    "com.canonical.Unity.LauncherEntry", "Update");

//set the application ID
signal << "application://firefox.desktop";

//set the properties
QVariantMap properties;
    ...
signal << properties;

//send the signal
QDBusConnection::sessionBus().send(signal);

柜台

要设置计数器,您需要设置属性以使计数可见,并赋予其所需的整数值:

qint64 counter_value = 1;
properties["count-visible"] = true; //set the count to visible
properties["count"] = counter_value; //set the counter value

进度条

要设置进度条,您需要设置属性以使进度可见,并赋予其所需的双精度值:

double progress_value = 0.5;
properties["progress-visible"] = true; //set the progress bar to visible
properties["progress"] = progress_value; //set the progress value

快速列表

可以使用 dbusmenu Qt 库来设置快速列表。您需要包含头文件:

#include <dbusmenuexporter.h>

快速列表在 Qt 中创建为QMenu菜单。此菜单使用对象通过 dbusmenu“导出” DBusMenuExporter。导出时,您为该对象指定一个唯一路径,然后引用该路径来告诉启动器项将哪个菜单显示为快速列表。

在主窗口类声明中,添加以下实例变量:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

然后,在构造函数中:

quicklist = new QMenu(this);
//exports the menu over dbus using the object: /com/me/myapp/quicklist
quicklist_exporter = new DBusMenuExporter("/com/me/myapp/quicklist", quicklist);

要向菜单添加项目,请使用菜单的 [addAction](http://qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) 方法添加 [QAction](http://qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) 对象。

要设置启动器图标的快速列表,请设置信号的“quicklist”属性:

properties["quicklist"] = "/com/me/myapp/quicklist";

配置项目文件

您需要配置 .pro 文件以添加 dbus 支持:QT += dbus。为了使用 quicklist 支持进行构建,您需要libdbusmenu*dev安装 dbusmenu-qt 开发库 ()。然后,您可以将以下内容添加到项目文件以包含 dbusmenu 库:

#import the dbusmenu-qt library for quicklists
greaterThan(QT_MAJOR_VERSION, 4) {
    INCLUDEPATH += /usr/include/dbusmenu-qt5/
    LIBS += -ldbusmenu-qt5
} else {
    INCLUDEPATH += /usr/include/dbusmenu-qt/
    LIBS += -ldbusmenu-qt
}

示例应用程序

要查看使用 Qt 的所有启动器功能的完整示例,请查看此Github 项目

相关内容