C 在GTK3和x2B中显示信息对话框时出错;
单击gtk_绘图区域时,我试图显示一个信息对话框窗口 以下是我正在使用的代码: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
#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.cpkg 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;
}