LINUX.ORG.RU

GTK4-работа с виджетами

 


0

4

Здравствуйте! Никак не пойму приведение типов для виджетов. В программе:

#include <gtk/gtk.h>
#include <stdio.h>
 
static void app_activate (GApplication *app)
{
  GtkWidget *win = gtk_application_window_new (GTK_APPLICATION (app));
  gtk_window_set_title (GTK_WINDOW (win), "Тест");
  gtk_window_set_default_size (GTK_WINDOW (win), 400, 300);
  GtkWidget *nb = gtk_notebook_new(); // GtkNotebook
  gtk_window_set_child (GTK_WINDOW (win),nb);
  GtkWidget *lblTab1 = gtk_label_new("Настройки");
  GtkWidget *pnd1 = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
  gtk_notebook_append_page(GTK_NOTEBOOK(nb), pnd1, lblTab1);
  GtkWidget *lblTab2 = gtk_label_new("Графики");
  GtkWidget *pnd2 = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
  gtk_notebook_append_page(GTK_NOTEBOOK(nb), pnd2, lblTab2);
  GtkWidget *lblPnd1 = gtk_label_new("Первый элемент");
//  gtk_window_set_child (GTK_PANED(pnd1), lblPnd1); // Ошибка
//  gtk_window_set_child (pnd1, lblPnd1); // Ошибка
//  gtk_window_set_child (GTK_WINDOW(pnd1), lblPnd1); // Ошибка
//  gtk_window_set_child (GTK_WIDGET(pnd1), lblPnd1); // Ошибка
  gtk_window_present (GTK_WINDOW (win));
}
 
int main (int argc, char **argv)
{
  GtkApplication *app = gtk_application_new ("mainwin.study", G_APPLICATION_DEFAULT_FLAGS);
  g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
  int stat =g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
  system("pause");
  return stat;
}

Не удается правильно привезти указатель на виджет lblPnd1 к нужному типу в gtk_window_set_child. Помогите, пожалуйста, разобраться (когда и как нужно преобразовывать различные типы виджетов).



Последнее исправление: Zhbert (всего исправлений: 1)

Обрати внимание, что на ЛОРе по умолчанию форматирование собщение в Markdown, а ты использовал LORCODE. Я тебе поправил, но в следующий раз давай уж сам.

Zhbert ★★★★★
()

Что-то мне подсказывает, что для добавления подчинённого GtkWidget в GtkPaned вам нужны gtk_paned_set_start_child (https://docs.gtk.org/gtk4/method.Paned.set_start_child.html) или gtk_paned_set_end_child (https://docs.gtk.org/gtk4/method.Paned.set_end_child.html).

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 2)

Потому что gtk_window_set_child на то и window, что первым аргументом там должен быть window, а не панель от нотебука. И child у window, насколько я помню, единственный, он же виджет верхнего уровня. Всё остальное цепляется уже в него.

SkyMaverick ★★★★★
()

Представь, что это объектно ориентированный код. У каждого класса есть свои методы. А теперь представь язык C, у него нет такого функционала, как в C++. Таким образом, чтобы быть более похожим на объектно ориентированный, ибо на уровне ассемблера он так и выглядит, первым аргументом мы ставим тот класс (структуру), которая считается главной для этого метода.

Если работаем с виджетом окна, то всё что

gtk_window_*

относится к окну. Ты не можешь paned класс присвоить к окну, так как это другой класс.

peeruoeso
()

Ты кстати можешь, если HBox является GtkWidget впихнуть в него label и button и получиться вкладка с названием и кнопкой закрыть. Если HBox не GtkWidget, то можешь использовать GtkFrame без рамки. В gtk3 hbox точно можно было, а в gtk4 что-то я подзабыл. Кажется можно и так и так. Что HBox, что Frame, оба контейнеры и ты можешь так же как и в titlebar вставлять свои виджеты.

peeruoeso
()
Последнее исправление: peeruoeso (всего исправлений: 1)

// Ошибка

Попробуй прочитать что в ошибке написано:

file.c:19:25: ошибка: в передаче аргумента 1 «gtk_window_set_child»: несовместимый тип указателя [-Wincompatible-pointer-types]
   19 |   gtk_window_set_child (pnd1, lblPnd1); // Ошибка
      |                         ^~~~
      |                         |
      |                         GtkWidget * {aka struct _GtkWidget *}
/usr/include/gtk-4.0/gtk/gtkwindow.h:230:59: замечание: ожидался тип «GtkWindow *» {aka «struct _GtkWindow *»}, но аргумент имеет тип «GtkWidget *» {aka «struct _GtkWidget *»}
  230 | void     gtk_window_set_child              (GtkWindow    *window,
      |                                             ~~~~~~~~~~~~~~^~~~~~
nvl ★★★★
()

static void

стесняюсь спросить зачем так писать, это чтото меняет в компиляторе?!

или вы просто как обезьяны просто переписываете друг у друга?

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)