gpt4 book ai didi

C 和 GTK g_signal_connect 传递参数

转载 作者:行者123 更新时间:2023-11-30 16:47:41 30 4
gpt4 key购买 nike

无法让 g_signal_connect 正确传递参数。可能是因为我不理解“c_handler”或“data”参数。代码在这里:

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

编译成功。但我运行时的输出在这里:

graeme@graeme-HP-xw4300-Workstation ~/c/test $ ./ed10

(ed10:2974): Gtk-CRITICAL **: gtk_text_buffer_get_bounds: assertion 'GTK_IS_TEXT_BUFFER (buffer)' failed

最佳答案

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

(debugsig:26923): Gtk-CRITICAL **: gtk_text_buffer_get_bounds: 
assertion 'GTK_IS_TEXT_BUFFER (buffer)' failed

查看您的代码 - 您没有声明独立的 GTK_TEXT_BUFFER(例如 GtkTextBuffer *)gtk_text_view_new 将提供默认缓冲区,但如果您独立声明缓冲区,则也可以使用 gtk_text_view_new_with_buffer (buffer),例如gtk_text_buffer_new (NULL);(您将获得一个带有 gtk_text_view_newgtk_text_view_new_with_buffer (NULL); 的默认缓冲区)。你的选择...,你所拥有的将会起作用。

你真正的问题是你的回调函数原型(prototype)是错误的,它应该包含你的menuitem(这是真正的问题,它正在占用你的缓冲区 作为 GtkMenuItem 导致错误 'GTK_IS_TEXT_BUFFER (buffer)' failed),例如

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 ...

它也让我用不正确的原型(prototype)进行编译 - 将我绕在轴上一点:)

这是您的代码的工作示例:

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

如果您想查看更大的示例(GTK+2,但此处 100% 适用),请查看 https://github.com/drankinatty/gtkwrite 。 (textview 和缓冲区声明位于 gtk_windef.c 中)

关于C 和 GTK g_signal_connect 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43245733/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com