Bagaimana cara membuat indikator bekerja dengan Qt / C ++?

8

Saya menggunakan Qt IDE untuk membangun aplikasi saya agar dapat berpartisipasi dalam kontes Showdown Ubuntu. Dalam aplikasi saya, saya telah melakukan hal berikut:

void show_app(MainWindow *data)
{
    //this works fine:
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_PASSIVE);
    //this crashes the application:
    data->show();
}


void MainWindow::make_indicator()
{
    if(appindicator){
        //appindicator has already been created
        return;
    }
    appindicator = app_indicator_new("Format Junkie Indicator", "formatjunkie", APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
    GtkWidget* showapp_option;
    GtkWidget* indicatormenu = gtk_menu_new();
    GtkWidget* item = gtk_menu_item_new_with_label("Format Junkie main menu");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), indicatormenu);

    showapp_option = gtk_menu_item_new_with_label("Show App!");
    g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);
    gtk_menu_shell_append(GTK_MENU_SHELL(indicatormenu), showapp_option);

    gtk_widget_show_all(indicatormenu);
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_attention_icon(appindicator, "dialog-warning");

    app_indicator_set_menu(appindicator, GTK_MENU (indicatormenu));
}

Jadi, pada dasarnya saya mencoba membuat entri indikator sederhana, yang, saat klik, akan menyembunyikan indikator dan menampilkan aplikasi. Indikator dapat berhasil disembunyikan menggunakan PASSIVE thingy di sana, tetapi, selama panggilan data-> show () ;, aplikasi crash.

Bantuan apa pun yang saya lakukan salah akan dihargai! Selain itu, tolong bantu saya untuk memperbaiki masalah yang saya hadapi ini (sebagai alternatif, saya akan bermigrasi ke ikon baki yang lama dan bagus (bagaimanapun juga berfungsi dengan baik di 12,04) yang dapat saya tangani dengan sangat mudah dan efisien)

hytromo
sumber
apa kesalahan yang Anda dapatkan?
Hernantz
tidak ada kesalahan, itu hanya crash :)
hytromo
Bisakah Anda menambahkan Stacktrace dari crash ke pertanyaan Anda? Itu akan menunjukkan garis persis di mana aplikasi Anda mogok. Jika Anda memerlukan bantuan untuk itu, maka periksa tautan ini doc.qt.nokia.com/qtcreator-2.3/…
3
Intinya: jangan tidak mencampur GTK dan Qt dalam C ++ aplikasi. Perulangan acara terstruktur berbeda di masing-masing dan Anda akan mengalami apa-apa selain masalah.
Nathan Osman

Jawaban:

9

Anda tidak boleh menggunakan libappindicator untuk membuat Indikator Aplikasi dalam program Qt. Ada cara yang lebih baik!

Jika Anda menginstal sni-qt yang secara otomatis akan menggantikan instance QSystemTrayIcon dengan kode untuk rendering ikon baki itu sebagai Item Notifier Status KDE , yang akan diambil dan ditampilkan oleh layanan Indikator Aplikasi di bilah menu Ubuntu .

Ted Gould
sumber
Terima kasih. Saya tahu persis bagaimana QSystemTrayIcon bekerja, dan, seperti yang saya lihat, sni-qt sudah diinstal sebelumnya, jadi saya tidak akan menyesal jika saya memilikinya sebagai ketergantungan! Namun, aturannya harus lebih jelas tentang indikator (mereka merekomendasikan penggunaan indikator, sementara, pada kenyataannya, Qt menciptakan ikon baki yang sedang diubah menjadi indikator ...). Anda mungkin akan mendapatkan hadiahnya, tetapi saya harus menunggu 17 jam.
hytromo
2
Paket ini (sni-qt) sekarang rusak.
Goddard
2
"Ada cara yang lebih baik!" Tidak dengan Qt5, tidak ada.
Nathan Osman
-1

Saya akan mengatakan Anda mencoba melewati pointer "ini" sebagai pointer seperti "* ini" di sini

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);

untuk

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
sumber
Terima kasih, dengan saya menganggap ini sebagai erro (tidak dapat dikompilasi): error: tidak dapat mengonversi 'MainWindow' menjadi 'gpointer {alias void *}' untuk argumen '4' ke 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo