Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和GTK g_信号_连接通过参数_C_Gtk3 - Fatal编程技术网

C和GTK g_信号_连接通过参数

C和GTK g_信号_连接通过参数,c,gtk3,C,Gtk3,无法使g_信号连接正确传递参数。这可能是因为我不理解“c_处理程序”或“数据”参数。代码如下: #include <gtk/gtk.h> // Function prototypes void my_file_saveas(); // Function void my_file_saveas(GtkTextBuffer *buf) { // Get the start and end bounds of the buffer GtkTextIter start, end;

无法使g_信号连接正确传递参数。这可能是因为我不理解“c_处理程序”或“数据”参数。代码如下:

#include <gtk/gtk.h>

// Function prototypes
void my_file_saveas();

// Function
void my_file_saveas(GtkTextBuffer *buf)
{
  // Get the start and end bounds of the buffer
  GtkTextIter start, end;
  gtk_text_buffer_get_bounds (buf, &start, &end);
}

int main(int argc, char *argv[])
{
  GtkWidget *menubar;
  GtkWidget *fileMenu;
  GtkWidget *fileMh;
  GtkWidget *saveasMi;

  GtkWidget *view;
  GtkTextBuffer *buffer;
  GtkWidget *scroll_window;
  GtkWidget *vbox;

  GtkWidget *window;

  // Call this function first
  gtk_init(&argc, &argv);

  // Create widgets
  menubar = gtk_menu_bar_new();
  fileMenu = gtk_menu_new();
  fileMh = gtk_menu_item_new_with_label("File");
  saveasMi = gtk_menu_item_new_with_label("Save As");

  view = gtk_text_view_new();
  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));

  // Set out the menubar
  gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveasMi);
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMh), fileMenu);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMh);

  // Create a scroll window and add the view to it
  scroll_window = gtk_scrolled_window_new (NULL, NULL);
  gtk_container_add(GTK_CONTAINER(scroll_window), view);

  // Create a vertical box and add the menubar and scroll_window
  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), scroll_window, TRUE, TRUE, 0);

  // Setup top level window
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);

  // Put the box in the top level window
  gtk_container_add(GTK_CONTAINER(window), vbox);

  // Events
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  g_signal_connect(G_OBJECT(saveasMi), "activate", G_CALLBACK(my_file_saveas), buffer);

  // Display the window
  gtk_widget_show_all(window);

  // Runs main
  gtk_main();

  return 0;
}

您的错误是不言自明的(有点):

查看您的代码——您没有声明独立的
GTK_TEXT_缓冲区
(例如
GtkTextBuffer*)
gtk_text_view_new
将提供一个默认缓冲区,但是如果您单独声明一个缓冲区,例如
gtk_text_view_new_new(NULL),您也可以使用
gtk_text_view_new_with_buffer(buffer)
(您将使用
gtk_text_view_new
gtk_text_view_new_buffer(NULL);
)获得默认缓冲区)。你的选择…,你所拥有的将会起作用

你真正的问题是你的回调函数原型是错误的,它应该包含你的
菜单项
(这是真正的问题,它将你的
缓冲区
作为
GtkMenuItem
导致错误
'GTK_is_TEXT_buffer(buffer)'失败
),例如

坦率地说,我不能相信它让您编译时没有错误(或警告),但它做到了,我编译时使用了:

gcc -Wall -Wextra -pedantic -finline-functions -std=gnu11 ...
它也让我用不正确的原型进行编译——把我绕在轴上一点
:)

下面是代码的一个工作示例:

#include <gtk/gtk.h>

// Function
void my_file_saveas (GtkMenuItem *menuitem, gpointer data)
{
  // Get the start and end bounds of the buffer
  GtkTextBuffer *buf = GTK_TEXT_BUFFER (data);
  GtkTextIter start, end;
  gtk_text_buffer_get_bounds (buf, &start, &end);
  g_print ("Buffer has %d lines.\n", gtk_text_iter_get_line (&end) -
            gtk_text_iter_get_line (&start) + 1);

  if (menuitem) {}  /* stub to suppress warning of unused menuitem */
}

int main(int argc, char *argv[])
{
  GtkWidget *menubar;
  GtkWidget *fileMenu;
  GtkWidget *fileMh;
  GtkWidget *saveasMi;

  GtkWidget *view;
  GtkTextBuffer *buffer = NULL;
  GtkWidget *scroll_window;
  GtkWidget *vbox;

  GtkWidget *window;

  // Call this function first
  gtk_init(&argc, &argv);

  // Create widgets
  menubar = gtk_menu_bar_new();
  fileMenu = gtk_menu_new();
  fileMh = gtk_menu_item_new_with_label("File");
  saveasMi = gtk_menu_item_new_with_label("Save As");

  /** example declaring independent buffer 
   *
   *  buffer = gtk_text_buffer_new (NULL);
   *  view = gtk_text_view_new_with_buffer(buffer);
   */
  view = gtk_text_view_new();
  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  if (!view || !buffer) {
    g_print ("error - no view or buf.\n");
    return 1;
  }

  // Set out the menubar
  gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveasMi);
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMh), fileMenu);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMh);

  // Create a scroll window and add the view to it
  scroll_window = gtk_scrolled_window_new (NULL, NULL);
  gtk_container_add(GTK_CONTAINER(scroll_window), view);

  // Create a vertical box and add the menubar and scroll_window
  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), scroll_window, TRUE, TRUE, 0);

  // Setup top level window
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);

  // Put the box in the top level window
  gtk_container_add(GTK_CONTAINER(window), vbox);

  // Events
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  g_signal_connect(G_OBJECT(saveasMi), "activate", G_CALLBACK(my_file_saveas), 
                    buffer);

  // Display the window
  gtk_widget_show_all(window);

  // Runs main
  gtk_main();

  return 0;
}
#包括
//作用
作废我的\u文件\u另存为(GtkMenuItem*菜单项,gpointer数据)
{
//获取缓冲区的开始和结束边界
GtkTextBuffer*buf=GTK_TEXT_缓冲区(数据);
GtkTextIter开始,结束;
gtk_文本_缓冲区_获取_边界(buf、开始和结束);
g_print(“缓冲区有%d行。\n”),gtk_text_iter_get_行(&end)-
gtk_text_iter_get_line(&start)+1);
if(menuitem){}/*存根以抑制未使用menuitem的警告*/
}
int main(int argc,char*argv[])
{
GtkWidget*菜单栏;
GtkWidget*文件菜单;
GtkWidget*fileMh;
GtkWidget*saveasMi;
GtkWidget*视图;
GtkTextBuffer*buffer=NULL;
GtkWidget*滚动窗口;
GtkWidget*vbox;
GtkWidget*窗口;
//先调用这个函数
gtk_init(&argc,&argv);
//创建小部件
菜单栏=gtk_菜单栏_新建();
fileMenu=gtk_menu_new();
fileMh=gtk_菜单_项_新_,带有标签(“文件”);
saveasMi=gtk_菜单_项_新_,带_标签(“另存为”);
/**声明独立缓冲区的示例
*
*buffer=gtk_text_buffer_new(空);
*视图=gtk_文本_视图_新建_带_缓冲区(缓冲区);
*/
view=gtk_text_view_new();
buffer=gtk_text_view_get_buffer(gtk_text_view(view));
如果(!查看| |!缓冲区){
g_打印(“错误-无视图或buf。\n”);
返回1;
}
//设置菜单栏
gtk_menu_shell_append(gtk_menu_shell(fileMenu),saveasMi);
gtk_菜单项设置子菜单(gtk_菜单项(fileMh),fileMenu);
gtk_menu_shell_append(gtk_menu_shell(menubar),fileMh);
//创建一个滚动窗口并将视图添加到其中
scroll_window=gtk_scrolled_window_new(NULL,NULL);
gtk_容器添加(gtk_容器(滚动窗口),视图);
//创建垂直框并添加菜单栏和滚动窗口
vbox=gtk_盒_新(gtk_方向_垂直,0);
gtk_-box_-pack_启动(gtk_-box(vbox),菜单栏,假,假,0);
gtk_-box_-pack_启动(gtk_-box(vbox),滚动窗口,真,真,0);
//设置顶层窗口
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_窗口设置默认大小(gtk_窗口(窗口),640480);
//把盒子放在顶层窗口
gtk_容器添加(gtk_容器(窗口),vbox);
//事件
g_信号连接(g_对象(窗口),“销毁”,g_回调(gtk_主退出),NULL);
g_信号_连接(g_对象(saveasMi),“激活”,g_回调(我的文件_saveas),
缓冲液);
//显示窗口
gtk_小部件_全部显示(窗口);
//主要
gtk_main();
返回0;
}
如果您想看一个更大的示例(GTK+2,但这里100%适用),请看。(文本视图和缓冲区声明位于
gtk_windef.c

void my_file_saveas (GtkMenuItem *menuitem, gpointer data)
{
  // Get the start and end bounds of the buffer
  GtkTextBuffer *buf = GTK_TEXT_BUFFER (data);
  GtkTextIter start, end;
  gtk_text_buffer_get_bounds (buf, &start, &end);

  /* print the number of lines to stdout */
  g_print ("Buffer has %d lines.\n", gtk_text_iter_get_line (&end) -
            gtk_text_iter_get_line (&start) + 1);

  if (menuitem) {}  /* stub to suppress warning of unused menuitem */
}
gcc -Wall -Wextra -pedantic -finline-functions -std=gnu11 ...
#include <gtk/gtk.h>

// Function
void my_file_saveas (GtkMenuItem *menuitem, gpointer data)
{
  // Get the start and end bounds of the buffer
  GtkTextBuffer *buf = GTK_TEXT_BUFFER (data);
  GtkTextIter start, end;
  gtk_text_buffer_get_bounds (buf, &start, &end);
  g_print ("Buffer has %d lines.\n", gtk_text_iter_get_line (&end) -
            gtk_text_iter_get_line (&start) + 1);

  if (menuitem) {}  /* stub to suppress warning of unused menuitem */
}

int main(int argc, char *argv[])
{
  GtkWidget *menubar;
  GtkWidget *fileMenu;
  GtkWidget *fileMh;
  GtkWidget *saveasMi;

  GtkWidget *view;
  GtkTextBuffer *buffer = NULL;
  GtkWidget *scroll_window;
  GtkWidget *vbox;

  GtkWidget *window;

  // Call this function first
  gtk_init(&argc, &argv);

  // Create widgets
  menubar = gtk_menu_bar_new();
  fileMenu = gtk_menu_new();
  fileMh = gtk_menu_item_new_with_label("File");
  saveasMi = gtk_menu_item_new_with_label("Save As");

  /** example declaring independent buffer 
   *
   *  buffer = gtk_text_buffer_new (NULL);
   *  view = gtk_text_view_new_with_buffer(buffer);
   */
  view = gtk_text_view_new();
  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  if (!view || !buffer) {
    g_print ("error - no view or buf.\n");
    return 1;
  }

  // Set out the menubar
  gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveasMi);
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMh), fileMenu);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMh);

  // Create a scroll window and add the view to it
  scroll_window = gtk_scrolled_window_new (NULL, NULL);
  gtk_container_add(GTK_CONTAINER(scroll_window), view);

  // Create a vertical box and add the menubar and scroll_window
  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), scroll_window, TRUE, TRUE, 0);

  // Setup top level window
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);

  // Put the box in the top level window
  gtk_container_add(GTK_CONTAINER(window), vbox);

  // Events
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  g_signal_connect(G_OBJECT(saveasMi), "activate", G_CALLBACK(my_file_saveas), 
                    buffer);

  // Display the window
  gtk_widget_show_all(window);

  // Runs main
  gtk_main();

  return 0;
}