Как заменить lookup_widget в коде Glade3 / GTK3? - PullRequest
0 голосов
/ 03 апреля 2020

Я недавно воскресил проект из десятилетия go (https://github.com/clancyj4/z80sim) и столкнулся с проблемами, связанными с переходом с поляны 2 на 3.

Одна проблема заключается в том, что я использую функцию lookup_widget, которая определена в поддержке. c поляной 2, но не определена на полянке 3. И я не знаю, как ее заменить.

An пример того, как я его использую:

void init_Code(GtkWidget *Main)
{
  GtkWidget *widget;
  PangoFontDescription *codefont;

  codetext = lookup_widget(Main, "Code_Text");
  code_textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(codetext));

Конечно, я разобрался с проблемой, но не понимаю ответа:

The preferred solution is to pass a pointer to your ENTRY as the user data pointer when you connect the signal, or, if you're using gtk_builder_connect_signals(), store a pointer to ENTRY in your class and pass the class as the user data pointer.

, который имел в виду to:

on_BT_OK_clicked(GtkButton *button, gpointer user_data)
{
    //The line directly below is the one I get an error on
    GtkWidget *entry = lookup_widget( GTK_WIDGET(button), "ENTRY" );

Любое разъяснение было бы наиболее полезным.

РЕДАКТИРОВАТЬ: Я почти уверен, что все сигналы связаны, потому что я использую это:

  builder = gtk_builder_new();
  gtk_builder_add_from_file(builder, "z80em2.glade", NULL);

  window = GTK_WIDGET(gtk_builder_get_object(builder, "Main"));
  gtk_builder_connect_signals(builder, NULL);

Насколько я понимаю, codetext = lookup_widget(Main, "Code_Text") возвращает указатель на GtkWidget, называемый Code_Text, под виджетом Main, и я не вижу, как это сделать в GTK3.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Я не использовал Glade, но если у вас есть «ручной» код, который подключает обработчик сигнала, вы должны передать указатель на этот другой виджет в этом вызове. Затем он будет сохранен в GTK + и передан в качестве аргумента user_pointer обработчику событий.

Таким образом, он станет просто:

on_BT_OK_clicked(GtkButton *button, gpointer user_data)
{
    // This assumes the entry was passed to g_signal_connect() as 'data'
    GtkWidget *entry = GTK_WIDGET(user_data);

См. g_signal_connect().

0 голосов
/ 10 апреля 2020

Если вы все равно планируете интенсивно переписывать эту кодовую базу, может оказаться полезным реорганизовать виджеты в составные шаблоны виджетов, которые поддерживает Glade 3, и использовать gtk_widget_class_bind_template_child(), чтобы все виджеты, которые в противном случае вы бы с помощью lookup_widget() посмотрели на членов вашего класса виджетов. Но это не очень хорошее краткосрочное решение, потому что это потребует большого количества рефакторинга.

...