【问题标题】:c++ gtk console log function is wrong?c++ gtk控制台日志功能有错?
【发布时间】:2014-07-16 20:19:18
【问题描述】:

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

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

我有一个 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, "点击", G_CALLBACK(printc("send")), NULL);

我该如何解决我的问题?

【问题讨论】:

    标签: c++ user-interface onclick gtk gtk3


    【解决方案1】:

    问题是您试图调用 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");
    

    【讨论】:

    • 嗯,不行,这里是编译错误:pastebin.com/W2G13hnY,这里是代码:pastebin.com/6URfDakC
    • @Tekkzz:是的,对于 g++,您需要将这些字符串转换为 void 指针。我已经更新了示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2021-12-22
    • 2019-08-05
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多