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)


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 .


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.