Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 在GTK3和x2B中显示信息对话框时出错;_C_Dialog_Gtk3 - Fatal编程技术网

C 在GTK3和x2B中显示信息对话框时出错;

C 在GTK3和x2B中显示信息对话框时出错;,c,dialog,gtk3,C,Dialog,Gtk3,单击gtk_绘图区域时,我试图显示一个信息对话框窗口 以下是我正在使用的代码: #include <cairo.h> #include <gtk/gtk.h> void show_dialog_window(GtkWidget *widget, gpointer window) { GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIA

单击gtk_绘图区域时,我试图显示一个信息对话框窗口

以下是我正在使用的代码:

#include <cairo.h>
#include <gtk/gtk.h>

void show_dialog_window(GtkWidget *widget, gpointer window) {

  GtkWidget *dialog;
  dialog = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_INFO,
            GTK_BUTTONS_OK,
            "Hello dialog!");
  gtk_window_set_title(GTK_WINDOW(dialog), "Information");
  gtk_dialog_run(GTK_DIALOG(dialog));
  gtk_widget_destroy(dialog);
}

int main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *darea;

  gtk_init(&argc, &argv);

  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), 400, 300); 
  gtk_window_set_title(GTK_WINDOW(window), "Click me to show an Info_Dialog");

  darea = gtk_drawing_area_new();
  gtk_container_add(GTK_CONTAINER(window), darea);

  gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);

  g_signal_connect(window, "destroy",
      G_CALLBACK(gtk_main_quit), NULL);  
  g_signal_connect(window, "button-press-event", 
      G_CALLBACK(show_dialog_window), (gpointer) window); 


  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}
#包括
#包括
无效显示对话框窗口(GtkWidget*小部件,gpointer窗口){
GtkWidget*对话框;
对话框=gtk_消息_对话框_新建(gtk_窗口(窗口)),
GTK_对话_销毁_与_家长,
GTK_消息_信息,
GTK_按钮_正常,
“你好对话!”);
gtk_窗口设置标题(gtk_窗口(对话框),“信息”);
gtk_对话框运行(gtk_对话框(对话框));
gtk_小部件_销毁(对话框);
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*darea;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_窗口设置默认大小(gtk_窗口(窗口),400,300);
gtk_窗口设置标题(gtk_窗口(窗口),“单击我以显示信息对话框”);
darea=gtk_图纸_区域_新();
gtk_容器添加(gtk_容器(窗口),darea);
gtk_小部件_添加_事件(窗口、GDK_按钮_按下_掩码);
g_信号_连接(窗口,“销毁”,
G_回调(gtk_main_quit),NULL);
g_信号连接(窗口,“按钮按下事件”,
G_回调(显示_对话框窗口),(gpointer)窗口);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
当我使用命令gcc dialog.c
pkg config--cflags gtk+-3.0--libs--libs cairo
-lm-o dialog&&./dialog编译并运行此代码时,我在终端上得到以下信息:

分段故障(堆芯转储)


关于我做错了什么有什么建议吗?

问题在于回调函数。您正在使用以下原型:

void user_function(GtkWidget *widget, gpointer window)
并且,如以下文件所述:

调整回调,它应该是这样的:

gboolean show_dialog_window(GtkWidget *widget, GdkEvent *event, gpointer window) {

  GtkWidget *dialog;
  dialog = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_INFO,
            GTK_BUTTONS_OK,
            "Hello dialog!");
  gtk_window_set_title(GTK_WINDOW(dialog), "Information");
  gtk_dialog_run(GTK_DIALOG(dialog));
  gtk_widget_destroy(dialog);
  return TRUE;
}
返回
TRUE
将停止信号传播


更改后,程序应该可以正常工作。您可以访问
event
中的事件信息,例如按下了哪个按钮等。

使用
gdb
valgrind
调试代码。找到导致错误的行,然后从那里开始将参数
-Wall
-Wextra
添加到
gcc
可能是个好主意
gboolean show_dialog_window(GtkWidget *widget, GdkEvent *event, gpointer window) {

  GtkWidget *dialog;
  dialog = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_INFO,
            GTK_BUTTONS_OK,
            "Hello dialog!");
  gtk_window_set_title(GTK_WINDOW(dialog), "Information");
  gtk_dialog_run(GTK_DIALOG(dialog));
  gtk_widget_destroy(dialog);
  return TRUE;
}