Unity Launcher API für C ++

10

Ich versuche, mit QT SDK ein Programm in QT zu entwickeln. Gestern habe ich auf der offiziellen Ubuntu-Website über Unity Launcher API gelesen . Aber es gibt nur ein Beispiel für Vala und Python. Es ist möglich, die Unity Launcher-API (Quicklists, Zähler und Fortschrittsbalken) in C ++ zu verwenden. Wenn dies möglich ist, veröffentlichen Sie bitte ein Beispiel.

kv1dr
quelle
Was ist das für eine Qt-Sprache? Sprechen Sie über QScript oder fragen Sie nur nach einem C- oder C ++ - Beispiel?
Javier Rivera
Ich spreche darüber: qt.nokia.com/products Soweit ich weiß , ist Qt nur ein Framework für C ++.
kv1dr
Es ist nicht nur eine vollständige Bibliothek, die mit vielen Sprachen, einschließlich Python, verwendet werden kann. Ich verstehe, dass Sie nach einem C ++ - Beispiel fragen, wenn Sie Qt oder eine andere Bibliothek verwenden, spielt dies keine Rolle. Können Sie die Frage bearbeiten, um sie klar zu machen? (Übrigens: Unity 2D wird mit Qt erstellt),
Javier Rivera
Ok dann ... ich meine ein Beispiel für C ++ :)
kv1dr

Antworten:

6

Ich lerne auch Qt und habe versucht, einen Weg zu finden, die Unity-API in Qt zu verwenden. Ich konnte nur die Dbus-API verwenden, aber kein Glück mit Quicklist, da es ein DbusMenu benötigt und ich nicht weiß, wie ich das implementieren soll (lerne noch :) ).

Dies ist das Beispiel, das ich für mich selbst erstellt habe, und ich hoffe, dass es für andere nützlich ist. Vielleicht können Unity-Entwickler helfen, neuen Code (Quicklist) zu korrigieren / zu reparieren / hinzuzufügen :)

/*
    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();
}

Laden Sie das Beispiel hier herunter http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

Fuchsfrau
quelle
Ich habe keine Erfahrung mit C ++, aber warum importieren Sie nicht einfach libunity (#include <entity / entity / entity.h>) und verwenden die API?
Javier Rivera
Vielen Dank, Foxoman. Das funktioniert wie ein Zauber :) Warnung für alle: Vergiss den ersten Schritt nicht (wie ich), sonst funktioniert das nicht. :) (Erster Schritt: QT += dbus
Fügen
@JavierRivera: Ich habe versucht, Libunity zu importieren, aber es findet keine Einheit.h. Es gibt eine Menge Bibliotheken, die ich importieren kann (laut Autocomplete-Funktion), aber es gibt keine Bibliothek mit dem Namen Unity.
kv1dr
1
Hoppla, ich habe vergessen, libunity-dev zu installieren. Aber jetzt gibt es ein anderes Problem mit glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), aber ich habe libglib2.0-devinstalliert.
kv1dr
2
@ Javier Rivera: Ich habe versucht, die Libunity mit der QLibrary-Hilfe zu nutzen, aber es ist zu aufwändig, mit dbus api das gleiche Ergebnis zu erzielen.
Foxoman
4

Derzeit gibt es keine spezielle Bibliothek für den Zugriff auf Launcher-Funktionen von Qt C ++. Es gibt eine Libunity-Bibliothek, die jedoch stark glib-orientiert ist und daher für Qt relativ ungeeignet ist. Wie in der anderen Antwort erwähnt, besteht die bequemste Möglichkeit zur Integration in den Launcher in der Verwendung der Low-Level-dbus-API .

Das Grundkonzept für die Integration in den Launcher besteht darin, dass Sie ein Signal mit einer Anwendungs-ID und einer Reihe von Eigenschaften an den Launcher senden. Die Anwendungs-ID ist der Dateiname der .desktop-Datei, die normalerweise gespeichert wird in /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);

Zähler

Um den Zähler zu setzen, müssen Sie die Eigenschaften so einstellen, dass die Anzahl sichtbar ist, und ihm den gewünschten ganzzahligen Wert geben:

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

Fortschrittsanzeige

Um den Fortschrittsbalken festzulegen, müssen Sie die Eigenschaften so einstellen, dass der Fortschritt sichtbar ist, und ihm den gewünschten Doppelwert geben:

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

Kurze Liste

Die Quicklist kann mithilfe der Qt-Bibliothek dbusmenu festgelegt werden. Sie müssen die Header-Datei einschließen:

#include <dbusmenuexporter.h>

Die Quicklist wird als QMenuMenü in Qt erstellt. Dieses Menü wird über ein Busmenü mit einem DBusMenuExporterObjekt 'exportiert' . Beim Exportieren geben Sie diesem Objekt einen eindeutigen Pfad und verweisen dann auf diesen Pfad, um dem Startelement mitzuteilen, welches Menü als Quicklist angezeigt werden soll.

Fügen Sie in der Deklaration Ihrer Hauptfensterklasse die folgenden Instanzvariablen hinzu:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Dann in der Konstruktorfunktion:

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);

Verwenden Sie zum Hinzufügen von Elementen zum Menü die Methode [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) des Menüs, um [QAction] (http: /) hinzuzufügen. /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) Objekte.

Um die Quicklist des Startsymbols festzulegen, legen Sie die Eigenschaft 'quicklist' des Signals fest:

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

Projektdatei konfigurieren

Sie müssen die .pro-Datei konfigurieren, um dbus-Unterstützung hinzuzufügen : QT += dbus. Um mit Quicklist-Unterstützung erstellen zu können, müssen die Entwicklungsbibliotheken von dbusmenu-qt ( libdbusmenu*dev) installiert sein. Anschließend können Sie der Projektdatei Folgendes hinzufügen, um die dbusmenu-Bibliothek einzuschließen:

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

Beispielanwendung

In diesem Github-Projekt finden Sie ein vollständiges Beispiel für die Verwendung aller Launcher-Funktionen von Qt .

Lazyteq
quelle