最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c++ - Problem with opening the new window in GTK3 - Stack Overflow

programmeradmin1浏览0评论

I have a problem with GTK3. In main window of my app I can press the button that open second window.If I close it using Cancel button, everything is alright but if I use cross in the top right corner of the window the problem occurs. When I want to open this window again, it opens without content (empty window). How I can fix it? I'm designing my windows in Glade. I've attached a sample of code, I don't know the solution.

#include <iostream>
#include <vector>
#include <fstream>
#include <gtk/gtk.h>

struct Task {
    std::string name;
    std::string priority;
    std::string added_date;
    std::string deadline;
};

std::vector<Task> tasks;
GtkListStore *list_store;
GtkWidget *treeview;
GtkWidget *entry_new_task;
GtkWidget *add_task_window;
GtkWidget *add_task_button;
GtkWidget *cancel_button;
GtkWidget *add_combo_box_priorytet;
GtkWidget *add_deadline;

// Funkcja aktualizująca widok tabeli
void refresh_task_list();

// Funkcja deklarująca sortowanie po kliknięciu nagłówków
void on_column_clicked(GtkTreeViewColumn *column, gpointer user_data);

void on_open_add_task_window(GtkButton *button, gpointer user_data) {
    gtk_widget_show(add_task_window);  
}


void on_cancel_add_task_window(GtkButton *button, gpointer user_data) {
    gtk_widget_hide(add_task_window);  // Hide the task addition window
}


void setup_combo_box() {
GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING);

// Dodawanie opcji priorytetu
GtkTreeIter iter;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "Wysoki", -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "Średni", -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "Niski", -1);

gtk_combo_box_set_model(GTK_COMBO_BOX(add_combo_box_priorytet), GTK_TREE_MODEL(store));
gtk_combo_box_set_active(GTK_COMBO_BOX(add_combo_box_priorytet), 0);

// Zwolnienie pamięci po modelu
g_object_unref(store);
gtk_widget_show_all(add_combo_box_priorytet);
}

void on_add_task_confirm_clicked(GtkButton *button, gpointer user_data) {
const char *task_name = gtk_entry_get_text(GTK_ENTRY(entry_new_task));
if (!task_name || *task_name == '\0') {
    return;
}

}
}

int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);

tasks.push_back({"Zadanie 1", "Wysoki", "2025-02-02", "2025-02-05"});
tasks.push_back({"Zadanie 2", "Średni", "2025-02-01", "2025-02-10"});
tasks.push_back({"Zadanie 3", "Niski", "2025-02-02", "2025-02-07"});

GtkBuilder *builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "main_window.glade", NULL);
gtk_builder_add_from_file(builder, "add_window.glade", NULL);

GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
treeview = GTK_WIDGET(gtk_builder_get_object(builder, "treeview"));
entry_new_task = GTK_WIDGET(gtk_builder_get_object(builder, "add_new_task_input"));
add_combo_box_priorytet = GTK_WIDGET(gtk_builder_get_object(builder, "add_combo_box_priorytet"));
add_deadline = GTK_WIDGET(gtk_builder_get_object(builder, "add_deadline"));

add_task_window = GTK_WIDGET(gtk_builder_get_object(builder, "add_task_window"));
add_task_button = GTK_WIDGET(gtk_builder_get_object(builder, "add_new_task_btn"));
cancel_button = GTK_WIDGET(gtk_builder_get_object(builder, "cancel_new_task"));

GtkWidget *btn_add_task = GTK_WIDGET(gtk_builder_get_object(builder, "add_task"));
GtkWidget *btn_remove_task = GTK_WIDGET(gtk_builder_get_object(builder, "del_task"));
GtkWidget *btn_save = GTK_WIDGET(gtk_builder_get_object(builder, "write_list"));
GtkWidget *btn_load = GTK_WIDGET(gtk_builder_get_object(builder, "open_list"));

g_signal_connect(btn_add_task, "clicked", G_CALLBACK(on_open_add_task_window), NULL);
g_signal_connect(add_task_button, "clicked", G_CALLBACK(on_add_task_confirm_clicked), NULL);
g_signal_connect(cancel_button, "clicked", G_CALLBACK(on_cancel_add_task_window), NULL);
g_signal_connect(btn_remove_task, "clicked", G_CALLBACK(on_remove_task_clicked), NULL);
g_signal_connect(btn_save, "clicked", G_CALLBACK(on_save_tasks_to_file), NULL);
g_signal_connect(btn_load, "clicked", G_CALLBACK(on_load_tasks_from_file), NULL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(window,"destroy", G_CALLBACK(on_cancel_add_task_window),NULL);
setup_combo_box();
setup_treeview();

refresh_task_list();
gtk_widget_show(window);

gtk_main();
return 0;
}
发布评论

评论列表(0)

  1. 暂无评论