C ++ için Unity Launcher API'sı


10

QT SDK ile QT'de bazı programlar geliştirmeye çalışıyorum. Dün resmi ubuntu web sitesinde Unity Launcher API'sını okuyordum . Ancak sadece Vala ve python için örnek var. Unity Launcher API'sini (hızlı listeler, sayaçlar ve ilerleme çubukları) C ++ diliyle kullanmak mümkündür ve mümkünse lütfen bir örnek gönderin.


Bu Qt Dili nedir? QScript'ten mi bahsediyorsunuz yoksa sadece bir C veya C ++ örneği mi istiyorsunuz?
Javier Rivera

Bunun hakkında konuşuyorum: qt.nokia.com/products Anladığım kadarıyla Qt sadece C ++ için bir çerçeve.
kv1dr

Sadece Python da dahil olmak üzere birçok dilde kullanılabilen tam bir kütüphane. Qt kullanıyorsanız veya başka bir kütüphane önemli değilse, bir C ++ örneği istediğinizi anlıyorum. Soruyu netleştirmek için düzenleyebilir misiniz? (BTW: Unity 2D Qt ile yapıldı),
Javier Rivera

Tamam o zaman ... C ++ :) için bir örnek
kv1dr

Yanıtlar:


6

Ben de Qt öğreniyorum ve Qt içinde Unity API kullanmak için bir yol bulmaya çalıştım, ben sadece Dbus API kullanabilirsiniz, ama bir DbusMenu ihtiyacı olduğundan ve bunu (hala öğreniyorum :) nasıl bilmiyorum Quicklist ile şans yok ).

Bu kendim için yarattığım örnek ve umarım diğerleri için faydalıdır. Belki Unity geliştiricileri düzeltmek / düzeltmek / yeni kod eklemek için yardımcı olabilir (hızlı liste) :)

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

örneği buradan indirebilirsiniz http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r


C ++ ile ilgili herhangi bir deneyimim yok, ama neden sadece libunity (#include <unity / unity / unity.h>) alıp API'yi kullanmıyorsunuz?
Javier Rivera

Teşekkür ederim foxoman. Bu bir cazibe gibi çalışır :) Herkes için uyarı: İlk adımı unutmayın (yaptığım gibi), aksi takdirde bu işe yaramaz. :) (İlk adım: bu satırı Qt proje dosyanıza ekleyin QT += dbus
.pro

@JavierRivera: Özgürlüğü ithal etmeye çalıştım, ancak unity.h'yi bulamıyor. İçe aktarabileceğim bir ton kitaplık var (otomatik tamamlama işlevine göre), ancak birlik adında bir kitaplık yok.
kv1dr

1
Hata, libunity-dev kurmayı unuttum. Ama şimdi, glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory) ile ilgili başka bir sorun var , ancak libglib2.0-devyükledim.
kv1dr

2
@Javier Rivera: QLibrary yardımı ile özgürlüğü kullanmaya çalıştım, ancak dbus api ile aynı sonuca ulaşmak çok çaba gerektiriyor.
foxoman

4

Şu anda Qt C ++ 'dan başlatıcı işlevselliğine erişmek için belirli bir kütüphane yok. Bir libunity kütüphanesi var, ancak bu büyük ölçüde glib yönelimli, bu yüzden Qt için nispeten uygun değil. Diğer cevapta belirtildiği gibi, başlatıcı ile entegre olmanın en uygun yolu düşük seviyeli dbus API'yi kullanmaktır .

Başlatıcı ile nasıl entegre edeceğinizin temel konsepti, başlatıcıya bir uygulama kimliği ve bir dizi özellik ile bir sinyal göndermenizdir. Uygulama kimliği, normalde depolanan .desktop dosyasının dosya adıdır /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);

sayaç

Sayacı ayarlamak için özellikleri sayım görünür olacak şekilde ayarlamanız ve istenen tamsayı değerini vermeniz gerekir:

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

İlerleme çubuğu

İlerleme çubuğunu ayarlamak için, özellikleri ilerleme durumu görünür olacak şekilde ayarlamanız ve ona istenen çift değeri vermeniz gerekir:

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

Hızlı liste

Hızlı liste dbusmenu Qt kütüphanesi kullanılarak ayarlanabilir. Başlık dosyasını eklemeniz gerekir:

#include <dbusmenuexporter.h>

Hızlı liste QMenuQt. Bu menü, bir DBusMenuExporternesne kullanılarak dbusmenu üzerinden 'dışa aktarılır' . Dışa aktarırken, bu nesneye benzersiz bir yol verir ve ardından başlatıcı öğesine hangi listenin hızlı liste olarak görüntüleneceğini söylemek için bu yolu referans alırsınız.

Ana pencere sınıfı bildiriminize aşağıdaki örnek değişkenleri ekleyin:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Ardından, yapıcı işlevinde:

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

Menüye öğe eklemek için, menünün [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) yöntemini kullanarak [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) nesneler.

Başlatıcı simgesinin hızlı listesini ayarlamak için sinyalin 'hızlı liste' özelliğini ayarlayın:

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

Proje Dosyasını Yapılandırma

Sen dbus desteği eklemek için .pro dosyayı yapılandırmanız gerekir: QT += dbus. Hızlı liste desteğiyle derlemek için dbusmenu-qt geliştirme kitaplıklarının ( libdbusmenu*dev) kurulu olması gerekir. Daha sonra dbusmenu kütüphanesini dahil etmek için proje dosyasına aşağıdakileri ekleyebilirsiniz:

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

Örnek Uygulama

Qt'nin tüm başlatıcı işlevlerini kullanarak tam bir örnek görmek için bu Github projesine bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.