c++ gtk控制台日志功能有错?

标签 c++ user-interface onclick gtk gtk3

你好,优秀的程序员和软件工程师社区 ;)

我想创建一个像日志函数一样工作的函数。

我有一个 c++ gtk GUI 程序,每个按钮点击都应该记录在控制台上,所以如果我单击“发送”,它应该将“发送”写入控制台。这里的代码:

#include <gtk/gtk.h>

static void printc(const gchar* msg, GtkWidget *widget, gpointer data){
  g_print(msg);
}

int main(int argc, char *argv[]){
  GtkBuilder *builder;
  GObject *wnd;
  GObject *btn;

  gtk_init(&argc, &argv);

  builder = gtk_builder_new();
  gtk_builder_add_from_file(builder, "builder.ui", NULL);

  wnd = gtk_builder_get_object(builder, "wnd");
  g_signal_connect(wnd, "destroy", G_CALLBACK(gtk_main_quit), NULL);

  btn = gtk_builder_get_object(builder, "btn_send");
  g_signal_connect(btn, "clicked", G_CALLBACK(printc("send")), NULL);

  gtk_main();

  return 0;
}

错误:

main.cpp:22:60: error: too few arguments to function ‘void printc(const gchar*, GtkWidget*, gpointer)’

g_signal_connect(btn, "clicked", G_CALLBACK(printc("send")), NULL);

我该如何解决我的问题?

最佳答案

问题是您试图调用 printc() 而不是将其作为用于回调的引用传递。这需要以与使用“销毁”信号的方式类似的方式进行设置。另请注意,信号及其回调接受“用户数据”作为尾部参数,您可以使用它来传递自定义的每个回调文本(如果您希望将文本作为第一个参数,也可以使用 g_signal_connect_swapped() )。鉴于此,按如下方式设置回调:

static void printc (GtkWidget *widget, const gchar* msg) { ... }
...
g_signal_connect (btn, "clicked", G_CALLBACK(printc), (const gpointer)"send");

或者交换连接:

static void printc (const gchar* msg, GtkWidget *widget) { ... }
...
g_signal_connect_swapped (btn, "clicked", G_CALLBACK(printc), (const gpointer)"send");

关于c++ gtk控制台日志功能有错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24789882/

相关文章:

c++ - eekg() 函数失败

python - Tkinter 编辑菜单,macos 中的特殊字符选项

javascript - iframe onclick 动画或切换

javascript - 在表单提交时触发谷歌分析事件

c++ - 对象动态数组 Sans Vector 类

javascript - QT5 - QDataStream - 使用 javascript 序列化和反序列化

c++ - 什么是正确的封装语法?

database - 为什么不基于 DB schema 构建 UI?

java - 在我的 GUI (java) 中显示 CMD 输出

android - 在 android Activity 中放置 onclick 监听器的正确位置在哪里?