API trình khởi chạy Unity cho C ++


10

Tôi đang cố gắng phát triển một số chương trình trong QT với QT SDK. Hôm qua tôi đã đọc về Unity Launcher API trên trang web chính thức của Ubuntu. Nhưng có ví dụ chỉ dành cho Vala và python. Có thể sử dụng API Unity Launcher (danh sách nhanh, bộ đếm và thanh tiến trình) với ngôn ngữ C ++ và nếu có thể, vui lòng gửi một ví dụ.


Ngôn ngữ Qt đó là gì? Bạn đang nói về QScript hay bạn chỉ đang yêu cầu một ví dụ C hoặc C ++?
Javier Rivera

Tôi đang nói về điều này: qt.nokia.com/products Nhiều như tôi hiểu Qt chỉ là một khuôn khổ cho C ++.
kv1dr

Không chỉ, đó là một thư viện đầy đủ có thể được sử dụng với vô số ngôn ngữ, bao gồm cả Python. Tôi hiểu rằng bạn đang yêu cầu một ví dụ về C ++, nếu bạn sử dụng Qt hoặc bất kỳ thư viện nào khác đều không thành vấn đề. Bạn có thể chỉnh sửa câu hỏi để làm cho nó rõ ràng?. (BTW: Unity 2D được tạo bằng Qt),
Javier Rivera

Được rồi ... ý tôi là một ví dụ cho C ++ :)
kv1dr

Câu trả lời:


6

Tôi cũng đang học Qt và đã cố gắng tìm cách sử dụng Unity API trong Qt, tôi chỉ có thể sử dụng API Dbus, nhưng không may mắn với Quicklist vì nó cần DbusMothy và tôi không biết cách triển khai điều đó (vẫn đang học :) ).

Đây là ví dụ tôi tự tạo cho mình và tôi hy vọng nó hữu ích cho người khác. Có lẽ các nhà phát triển Unity có thể giúp sửa / sửa / thêm mã mới (danh sách nhanh) vào đó :)

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

tải xuống ví dụ tại đây http://ubfoxone.com/1SLDPcN9OhrU6LD1wgDs3r


Tôi chưa có kinh nghiệm nào về C ++, nhưng tại sao bạn không nhập libunity (#include <unity / unity / unity.h>) và sử dụng API?
Javier Rivera

Cảm ơn bạn Foxoman. Điều này hoạt động như một cơ duyên :) Cảnh báo cho mọi người: Đừng quên bước đầu tiên (như tôi đã làm), nếu không điều này sẽ không hoạt động. :) (Bước đầu tiên: thêm dòng này vào tệp dự án Qt của bạn .pro QT += dbus)
kv1dr

@JavierRivera: Tôi đã cố gắng nhập khẩu miễn dịch, nhưng nó không tìm thấy sự thống nhất.h. Có một tấn thư viện tôi có thể nhập (theo chức năng tự động hoàn thành), nhưng không có thư viện có tên là unity.
kv1dr

1
Rất tiếc, tôi quên cài đặt libunity-dev. Nhưng bây giờ, có một vấn đề khác với glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), nhưng tôi đã libglib2.0-devcài đặt.
kv1dr

2
@Javier Rivera: Tôi đã cố gắng sử dụng miễn dịch với sự trợ giúp của Thư viện nhưng phải mất rất nhiều nỗ lực để đạt được kết quả tương tự với dbus api.
foxoman

4

Hiện tại không có thư viện cụ thể để truy cập chức năng launcher từ Qt C ++. Có một thư viện miễn dịch nhưng điều này được định hướng rất nhiều vì vậy tương đối không phù hợp với Qt. Như đã đề cập trong câu trả lời khác, cách thuận tiện nhất để tích hợp với trình khởi chạy là sử dụng API dbus cấp thấp .

Khái niệm cơ bản về cách tích hợp với trình khởi chạy là bạn gửi tín hiệu đến trình khởi chạy với ID ứng dụng và một bộ thuộc tính. ID ứng dụng là tên tệp của tệp .desktop, thường được lưu trữ trong /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);

Quầy tính tiền

Để đặt bộ đếm, bạn sẽ cần đặt các thuộc tính sao cho số đếm được hiển thị và cung cấp cho nó giá trị nguyên mong muốn:

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

Thanh tiến trình

Để đặt thanh tiến trình, bạn sẽ cần đặt các thuộc tính sao cho tiến trình được hiển thị và cung cấp cho nó giá trị gấp đôi mong muốn:

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

Danh sách nhanh chóng

Danh sách nhanh có thể được thiết lập bằng cách sử dụng thư viện dbusmenu Qt. Bạn sẽ cần bao gồm tệp tiêu đề:

#include <dbusmenuexporter.h>

Danh sách nhanh được tạo như một QMenumenu trong Qt. Menu này được 'xuất' qua dbusmenu bằng cách sử dụng một DBusMenuExporterđối tượng. Khi xuất, bạn cung cấp cho đối tượng này một đường dẫn duy nhất và sau đó tham chiếu đường dẫn đó để báo cho mục trình khởi chạy trình đơn nào sẽ hiển thị dưới dạng danh sách nhanh.

Trong khai báo lớp cửa sổ chính của bạn, thêm các biến đối tượng sau:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Sau đó, trong hàm constructor:

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

Để thêm các mục vào menu, sử dụng phương thức [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) của menu để thêm [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) các đối tượng.

Để đặt danh sách nhanh của biểu tượng trình khởi chạy, hãy đặt thuộc tính 'danh sách nhanh' của tín hiệu:

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

Cấu hình tệp dự án

Bạn sẽ cần định cấu hình tệp .pro để thêm hỗ trợ dbus : QT += dbus. Để xây dựng với sự hỗ trợ danh sách nhanh, bạn sẽ cần phải libdbusmenu*devcài đặt các thư viện phát triển dbusmenu-qt ( ). Sau đó, bạn có thể thêm các mục sau vào tệp dự án để bao gồm thư viện 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
}

Ứng dụng ví dụ

Để xem ví dụ đầy đủ bằng cách sử dụng tất cả các chức năng của trình khởi chạy từ Qt, hãy xem dự án Github này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.