- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
无法让 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_new
或 gtk_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/
我正在尝试编译一些代码,但出现以下错误: error: invalid use of member (did you forget the ‘&’ ?) 这是来自 g_signal_connect 调
我正在尝试连接一个对象以销毁一个小部件,但什么也没有发生,而且我收到了一个错误 调用如下: g_signal_connect(bKill, "clicked", G_CALLBACK(AppWindo
我得到的代码适用于鼠标左键单击按钮,但我将如何使用它来获取鼠标右键单击信号: g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(butt
根据 GObject 引用 g_signal_connect_swapped(instance, detailed_signal, c_handler, data); connects a GCall
通过 g_signal connect,我尝试使用“数据”字段传递一个简单字符“S”的参数。 ???(我想我明白该字段不是用于数据的,而是用于指向数据的指针。)??? 无论如何,我有这样的代码: g_
我使用 gtk 创建了一个窗口。然后我想向按钮添加点击事件。我尝试了几种方法但没有成功 #if GTK_CHECK_VERSION(3,0,0) GtkBuilder* builder = n
我有这段代码: int gui_showScore(struct Game *game) { printf("%p\n", game); return NO_ERROR; } int
我已经创建了一个用于创建 gtk 主窗口的简单类。 我想知道将类成员函数作为参数传递给 G_CALLBACK 函数的正确方法是什么? 为什么 g_signal_connect(button, "cli
无法让 g_signal_connect 正确传递参数。可能是因为我不理解“c_handler”或“data”参数。代码在这里: #include // Function prototypes vo
我正在尝试学习如何在 gstreamer 中使用动态垫。因此,我尝试添加填充添加信号,以便在创建元素后我可以收到消息。但是,我没有收到任何消息。 这是代码: #include static void
我正在尝试在我的项目中使用 Glade 来生成一个包含窗口、网格的文件……但是当我尝试监听单击我的按钮的事件时,我遇到了一个错误,我不明白为什么 :s 我遇到了那些错误.. GLib-GObject
我正在阅读 GStreamer 应用程序开发人员手册,它在消息处理/事件处理的上下文中讨论了管道总线,他们讨论了 2 个函数:gst_bus_add_watch() 和 g_signal_connec
刚开始接触GTK+编程,一个星期以来我主要遇到了一个大问题,这里代码解释一下: for(j=1;ji); } 我通常应该得到我用 a.i=i 初始化的 i;因为我没有得到 i 和 j 的 requie
我试图找到一个类似的问题,但找不到任何解决方案。 我有一个使用 GTK3 用 C 语言编写的软件,我正在尝试为在我的 GUI 上按下按钮设置一个回调。该代码应该传递一个整数作为参数,让我的回调函数知道
所以,我正在努力实现以下目标: 用户正在选择文件,该文件的路径保存在变量文件名中。选择文件后,用户通过复选框选择要设置的 chmod。 我有这样的东西: g_signal_connect (ux, "
// gcc 1.c -o 0 $(pkg-config --cflags --libs gtk+-2.0) #include #include struct tst { GtkWidge
我正在尝试通过 g_signal_connect 传递堆中分配的数据,但它显示出一些奇怪的行为。 我是这样传递值的: int *test = new int(100); g_signal_connec
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
g_signal_connect() 需要一个 gpointer、一个字符常量、一个 GCallback 和另一个 gpointer 作为参数. 我正在阅读 Foundations of GTK+ 这
我看过GTK+ g_pointer_connect passing data incorrectly但即使在尝试按照人们所说的去做之后,我的问题仍然存在。 我需要做的是从数组数组中传递一个数组。 声明
我是一名优秀的程序员,十分优秀!