API Unity Launcher для C ++


10

Я намагаюся розробити якусь програму в QT за допомогою QT SDK. Вчора я читав про Unity Launcher API на офіційному веб-сайті ubuntu. Але є приклад лише для Вали та пітона. Можна використовувати API Unity Launcher (швидкі списки, лічильники та панелі прогресу) з мовою C ++, і якщо можливо, напишіть приклад.


Що це за мова Qt? Ви говорите про QScript або просто просите приклад C або C ++?
Хав'єр Рівера

Я говорю про це: qt.nokia.com/products Наскільки я розумію, Qt є лише основою для C ++.
kv1dr

Не просто, це повна бібліотека, яка може використовуватися з безліччю мов, включаючи Python. Я розумію, що ви запитуєте приклад C ++, якщо ви використовуєте Qt або будь-яку іншу бібліотеку не має значення. Чи можете ви відредагувати питання, щоб зрозуміти? (BTW: Unity 2D зроблений з Qt),
Хав'єр Рівера

Гаразд тоді ... я маю на увазі приклад для C ++ :)
kv1dr

Відповіді:


6

Я також вивчаю Qt і намагався знайти спосіб використання API Unity в Qt, я міг використовувати лише API Dbus, але не пощастило з Quicklist, оскільки йому потрібен DbusMenu, і я не знаю, як це реалізувати (все ще навчаюсь :) ).

Це приклад, який я створив для себе, і я сподіваюся, що він корисний для інших. Можливо, Unity devs може допомогти виправити / виправити / додати до нього новий код (швидкий список) :)

/*
    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 <Единство / Єдність / Єдність.h>) та не використовувати API?
Хав'єр Рівера

Дякую фоксоману. Це працює як шарм :) Попередження для всіх: Не забувайте перший крок (як я зробив), інакше це не вийде. :) (Перший крок: додайте цей рядок до файлу проекту Qt QT += dbus
.pro

@JavierRivera: Я намагався імпортувати свободу, але вона не знаходить єдності. Є тонна бібліотек, які я можу імпортувати (відповідно до функції автозаповнення), але немає бібліотеки з назвою єдність.
kv1dr

1
ой, я забув встановити libunity-dev. Але тепер є ще одна проблема з glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), але я libglib2.0-devвстановив.
kv1dr

2
@Javier Rivera: Я намагався використати лібільність за допомогою QLibrary, але потрібно докласти чимало зусиль, щоб досягти такого ж результату з dbus api.
foxoman

4

В даний час немає спеціальної бібліотеки для доступу до функцій запуску з Qt C ++. Існує бібліотека лібільності, але вона сильно орієнтована на гліб, тому відносно не підходить до Qt. Як було сказано в іншій відповіді, найзручніший спосіб інтеграції з пусковим пристроєм - це використання dbus API низького рівня .

Основна концепція того, як інтегруватися з пусковим пристроєм, - це надіслати сигнал до пускового пристрою з ідентифікатором програми та набором властивостей. Ідентифікатор програми - це ім'я файлу .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

Швидкий список

Швидкий список можна встановити за допомогою бібліотеки Qt dbusmenu. Вам потрібно буде включити заголовок:

#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) об’єктів.

Для встановлення швидкого списку піктограми запуску встановіть властивість сигналу "швидкого списку":

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

Налаштування файлу проекту

Вам потрібно буде налаштувати файл .pro для додавання Dbus підтримки: QT += dbus. Для побудови з підтримкою швидкого списку вам потрібно буде встановити бібліотеки розвитку ( 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.