API Peluncur Persatuan untuk C ++

10

Saya mencoba mengembangkan beberapa program di QT dengan QT SDK. Kemarin saya membaca tentang Unity Launcher API di situs web ubuntu resmi. Tetapi ada contoh hanya untuk Vala dan python. Dimungkinkan untuk menggunakan Unity Launcher API (daftar cepat, penghitung, dan bilah kemajuan) dengan bahasa C ++ dan jika memungkinkan, silakan kirim contoh.

kv1dr
sumber
Apa itu Bahasa Qt? Apakah Anda berbicara tentang QScript atau Anda hanya meminta contoh C atau C ++?
Javier Rivera
Saya berbicara tentang ini: qt.nokia.com/products. Setahu saya Qt hanyalah kerangka kerja untuk C ++.
kv1dr
Bukan hanya, itu adalah perpustakaan lengkap yang dapat digunakan dengan banyak bahasa, termasuk Python. Saya mengerti bahwa Anda meminta contoh C ++, jika Anda menggunakan Qt atau perpustakaan lain tidak masalah. Bisakah Anda mengedit pertanyaan untuk membuatnya jelas? (BTW: Unity 2D dibuat dengan Qt),
Javier Rivera
Oke kalau begitu ... maksud saya contoh untuk C ++ :)
kv1dr

Jawaban:

6

Saya juga belajar Qt dan mencoba menemukan cara untuk menggunakan Unity API di Qt, saya hanya bisa menggunakan Dbus API, tetapi tidak berhasil dengan Quicklist karena membutuhkan DbusMenu dan saya tidak tahu bagaimana mengimplementasikannya (masih belajar :) ).

Ini adalah contoh yang saya buat untuk diri saya dan saya harap ini berguna untuk orang lain. Mungkin Unity devs dapat membantu memperbaiki / memperbaiki / menambah kode baru (daftar cepat) ke sana :)

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

unduh contoh di sini http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

rubah
sumber
Saya belum punya pengalaman dalam C ++, tapi mengapa Anda tidak mengimpor libunity saja (# sertakan <unity / unity / unity.h>) dan gunakan API?
Javier Rivera
Terima kasih rubah Ini berfungsi seperti pesona :) Peringatan untuk semua orang: Jangan lupa langkah pertama (seperti yang saya lakukan), jika tidak ini tidak akan berhasil. :) (Langkah pertama: tambahkan baris ini ke file proyek Qt Anda QT += dbus
.pro
@JavierRivera: Saya mencoba mengimpor libunity, tetapi tidak menemukan unity.h. Ada banyak perpustakaan yang bisa saya impor (sesuai dengan fungsi autocomplete), tetapi tidak ada perpustakaan bernama unity.
kv1dr
1
wah, saya lupa menginstal libunity-dev. Tapi sekarang, ada masalah lain dengan glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), tetapi saya telah libglib2.0-devmenginstal.
kv1dr
2
@Javier Rivera: Saya mencoba menggunakan libunity dengan bantuan QLibrary tetapi butuh banyak upaya untuk mencapai hasil yang sama dengan dbus api.
foxoman
4

Saat ini tidak ada perpustakaan khusus untuk mengakses fungsionalitas peluncur dari Qt C ++. Ada perpustakaan libunity tetapi ini sangat berorientasi pada glib sehingga relatif tidak cocok untuk Qt. Seperti disebutkan dalam jawaban lain, cara paling nyaman untuk berintegrasi dengan peluncur adalah dengan menggunakan API dbus tingkat rendah .

Konsep dasar bagaimana mengintegrasikan dengan peluncur adalah Anda mengirim sinyal ke peluncur dengan ID aplikasi dan serangkaian properti. ID aplikasi adalah nama file dari file .desktop, biasanya disimpan di /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);

Melawan

Untuk mengatur penghitung, Anda perlu mengatur properti sedemikian sehingga penghitungan terlihat dan memberikan nilai integer yang diinginkan:

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

Bar Kemajuan

Untuk mengatur bilah kemajuan, Anda harus mengatur properti sedemikian sehingga kemajuan terlihat dan memberikan nilai ganda yang diinginkan:

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

Daftar cepat

Daftar cepat dapat diatur dengan menggunakan pustaka Qbus dbusmenu. Anda harus memasukkan file header:

#include <dbusmenuexporter.h>

Daftar cepat dibuat sebagai QMenumenu di Qt. Menu ini 'diekspor' melalui dbusmenu menggunakan DBusMenuExporterobjek. Saat mengekspor, Anda memberikan objek ini jalur unik dan kemudian referensi jalur itu untuk memberi tahu item peluncur menu mana yang akan ditampilkan sebagai daftar cepat.

Dalam deklarasi kelas jendela utama Anda, tambahkan variabel instance berikut:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Kemudian, dalam fungsi konstruktor:

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

Untuk menambahkan item ke menu, gunakan metode [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) dari menu untuk menambahkan [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) objek.

Untuk mengatur daftar cepat ikon peluncur, setel properti 'daftar cepat' dari sinyal:

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

Mengkonfigurasi File Proyek

Anda akan perlu untuk mengkonfigurasi file pro untuk menambahkan dukungan dbus: QT += dbus. Untuk membangun dengan dukungan daftar cepat, Anda perlu libdbusmenu*devmenginstal pustaka pengembangan dbusmenu-qt ( ). Anda kemudian dapat menambahkan yang berikut ke file proyek untuk memasukkan pustaka 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
}

Contoh Aplikasi

Untuk melihat contoh lengkap menggunakan semua fungsi peluncur dari Qt, lihat proyek Github ini .

lazyteq
sumber