适用于C ++的Unity Launcher API


10

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


那是什么Qt语言?您是在谈论QScript还是在索要C或C ++示例?
哈维尔·里维拉

我正在谈论这个:qt.nokia.com/products据我所知,Qt只是C ++的框架。
kv1dr 2011年

不仅如此,它是一个完整的库,可以与多种语言(包括Python)一起使用。据了解,如果您使用Qt或任何其他库都没有关系,那么您正在询问C ++示例。您可以编辑问题以使其清楚吗?(顺便说一句:Unity 2D是用Qt制作的),
哈维尔·里维拉,

好的,然后...我的意思是C ++的示例:)
kv1dr 2011年

Answers:


6

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

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

/*
    Unity Launcher Dbus API exmable for Qt
    foxoman [gplus.to/foxoman][foxoman.u@gmail.com]

    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


我没有C ++的经验,但是为什么不导入libunity(#include <unity / unity / unity.h>)并使用API​​?
哈维尔·里维拉

谢谢foxoman。这就像一种魅力:)向所有人发出警告:不要忘记第一步(就像我一样),否则将无法正常工作。:)(第一步:将此行添加到您的Qt项目文件.pro中 QT += dbus
kv1dr 2011年

@JavierRivera:我尝试导入自由,但找不到unity.h。我可以导入大量库(根据自动完成功能),但是没有名为unity的库。
2011年

1
糟糕,我忘了安装libunity-dev。但是现在,glib.h(/usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory)还有另一个问题,但是我已经libglib2.0-dev安装了。
kv1dr 2011年

2
@Javier Rivera:我尝试在QLibrary的帮助下使用libunity,但要使用dbus api达到相同的结果需要花费大量的精力。
foxoman

4

当前没有用于从Qt C ++访问启动器功能的特定库。有一个自由库,但是它是高度面向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值:

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>

快速列表QMenu在Qt中创建为菜单。此菜单通过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。为了使用快速列表支持进行构建,您将需要安装dbusmenu-qt开发库(libdbusmenu*dev)。然后,您可以将以下内容添加到项目文件中以包含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项目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.