Làm cách nào để tạo chỉ báo hoạt động với Qt / C ++?


8

Tôi đang sử dụng Qt IDE để xây dựng ứng dụng của mình để tham gia cuộc thi Ubuntu Showdown. Trong ứng dụng của mình, tôi đã thực hiện như sau:

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

Vì vậy, về cơ bản, tôi đang cố gắng tạo một mục chỉ báo đơn giản, khi nhấp vào, nó sẽ ẩn chỉ báo và hiển thị ứng dụng. Chỉ báo có thể được ẩn thành công bằng cách sử dụng điều PASSIVE ở đó, nhưng, trong khi dữ liệu cuộc gọi-> show ();, ứng dụng gặp sự cố.

Bất kỳ trợ giúp về những gì tôi đang làm sai sẽ được đánh giá cao! Ngoài ra, vui lòng giúp tôi khắc phục sự cố này mà tôi gặp phải (thay vào đó, tôi sẽ chuyển sang biểu tượng khay cũ và tốt (dù sao nó cũng hoạt động tốt trong 12.04) mà tôi có thể xử lý rất dễ dàng và hiệu quả)


bạn đang gặp phải rắc rối gì vậy?
Hernantz

không có lỗi, nó chỉ gặp sự cố :)
hytromo

Bạn có thể vui lòng thêm Stacktrace từ sự cố cho bạn không? Điều đó sẽ chỉ ra dòng chính xác mà ứng dụng của bạn bị sập. Nếu bạn cần trợ giúp về điều đó, thì hãy xem liên kết này doc.qt.nokia.com/qtcreator-2.3/ Kẻ

3
Điểm mấu chốt: không trộn lẫn GTK và Qt trong ứng dụng C ++. Vòng lặp sự kiện được cấu trúc khác nhau trong mỗi và bạn sẽ không gặp phải vấn đề gì ngoài rắc rối.
Nathan Osman

Câu trả lời:


9

Bạn không nên sử dụng libappindicator để tạo Chỉ báo ứng dụng trong các chương trình Qt. Có một cách tốt hơn!

Nếu bạn đã cài đặt sni-qt sẽ tự động thay thế các phiên bản QSystemTrayIcon bằng mã để hiển thị biểu tượng khay đó dưới dạng Mục Trình thông báo trạng thái KDE , dịch vụ Chỉ báo ứng dụng sẽ nhận và hiển thị trong thanh menu Ubuntu .


Cảm ơn. Tôi biết hoàn toàn cách QSystemTrayIcon hoạt động và, như tôi có thể thấy, sni-qt được cài đặt sẵn, vì vậy tôi sẽ không xin lỗi nếu tôi có nó như một phụ thuộc! Tuy nhiên, các quy tắc nên rõ ràng hơn về điều kiện chỉ báo (họ khuyến nghị sử dụng các chỉ báo, trong khi, trên thực tế, Qt tạo các biểu tượng khay đang được chuyển đổi thành chỉ báo ...). Bạn có thể sẽ có tiền thưởng, nhưng tôi phải đợi 17 giờ.
hytromo

2
Gói này (sni-qt) hiện đã bị hỏng.
Goddard

2
"Có một cách tốt hơn!" Không phải với Qt5, không có.
Nathan Osman

-1

Tôi muốn nói bạn thử chuyển con trỏ "này" thành một con trỏ như "* this" ở đây

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

đến

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

Cảm ơn, bởi tôi coi đây là một erro (nó không biên dịch): error: không thể chuyển đổi 'MainWindow' thành 'gpulum {aka void *}' cho đối số '4' thành 'gulong g_signal_connect_data (gpulum, const gchar *, GCallback, gpulum, GClensesNotify, GConnectFlags) '
hytromo
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.