标识符“GdkEventKey”未定义C/C++(20)

bfnvny8b  于 2024-01-09  发布在  C/C++
关注(0)|答案(1)|浏览(308)

这是我的C++和GTK-4代码。我试图使一个简单的计时器应用程序,可以听取全球和本地键盘快捷键时,我们锁定屏幕和停止计时器的基础上,在Linux Pop! OS 22工作

  1. #include <gtk-4.0/gtk/gtk.h>
  2. #include <gtk-4.0/gdk/gdk.h>
  3. #include <chrono>
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7. guint timerID = 0;
  8. chrono::steady_clock::time_point timePoint;
  9. GtkWidget *label;
  10. void startTimer()
  11. {
  12. if (timerID != 0)
  13. {
  14. gtk_label_set_text(GTK_LABEL(label), "Timer is already running");
  15. }
  16. else
  17. {
  18. gtk_label_set_text(GTK_LABEL(label), "Timer Started");
  19. timePoint = chrono::steady_clock::now();
  20. timerID = g_timeout_add(
  21. 1000,
  22. [](gpointer userData) -> gboolean
  23. {
  24. auto now = chrono::steady_clock::now();
  25. auto diff = chrono::duration_cast<chrono::seconds>(now - timePoint);
  26. gtk_label_set_text(GTK_LABEL(label), (to_string(diff.count()) + " seconds now!").c_str());
  27. return G_SOURCE_CONTINUE;
  28. },
  29. nullptr);
  30. }
  31. }
  32. void stopTimer()
  33. {
  34. if (timerID != 0)
  35. {
  36. g_source_remove(timerID);
  37. timerID = 0;
  38. gtk_label_set_text(GTK_LABEL(label), "Timer is not running");
  39. }
  40. else
  41. {
  42. gtk_label_set_text(GTK_LABEL(label), "Timer is not running");
  43. }
  44. }
  45. static gboolean onKeyPress(GtkWidget *widget, GdkEventKey *event, gpointer userData)
  46. {
  47. if (GDK_CONTROL_MASK && gdk_key_event_get_keyval(event) == GDK_KEY_Escape)
  48. {
  49. g_print("Ctrl + ESC key pressed\n");
  50. }
  51. return TRUE;
  52. }
  53. void applyStyle(GtkWidget *widget, const char *style)
  54. {
  55. GtkStyleContext *context = gtk_widget_get_style_context(widget);
  56. GtkCssProvider *provider = gtk_css_provider_new();
  57. gtk_css_provider_load_from_data(provider, style, -1);
  58. gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
  59. g_object_unref(provider);
  60. }
  61. static void activate(GtkApplication *app, gpointer userData)
  62. {
  63. GtkWidget *window;
  64. GtkWidget *box;
  65. GtkWidget *button;
  66. GtkWidget *grid;
  67. window = gtk_application_window_new(app);
  68. gtk_window_set_title(GTK_WINDOW(window), "Timer");
  69. gtk_window_set_default_size(GTK_WINDOW(window), 800, 350);
  70. g_signal_connect(window, "key-press-event", G_CALLBACK(onKeyPress), nullptr);
  71. box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
  72. gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
  73. gtk_widget_set_valign(box, GTK_ALIGN_CENTER);
  74. gtk_window_set_child(GTK_WINDOW(window), box);
  75. // button = gtk_button_new_with_label("Start");
  76. // g_signal_connect(button, "clicked", G_CALLBACK(printHelloWorld), nullptr);
  77. // g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_window_close), nullptr);
  78. // gtk_box_append(GTK_BOX(box), button);
  79. grid = gtk_grid_new();
  80. gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
  81. gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
  82. // gtk_window_set_child(GTK_WINDOW(window), grid);
  83. gtk_box_append(GTK_BOX(box), grid);
  84. label = gtk_label_new("Timer is not running");
  85. gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 2, 1);
  86. button = gtk_button_new_with_label("Start");
  87. applyStyle(button, "button { background: green; color: white; } button:active { background: darkgreen; }");
  88. g_signal_connect(button, "clicked", G_CALLBACK(startTimer), nullptr);
  89. gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 1, 1);
  90. button = gtk_button_new_with_label("Stop");
  91. applyStyle(button, "button { background: firebrick; color: white; } button:active { background: darkred; }");
  92. g_signal_connect(button, "clicked", G_CALLBACK(stopTimer), nullptr);
  93. gtk_grid_attach(GTK_GRID(grid), button, 1, 1, 1, 1);
  94. gtk_window_present(GTK_WINDOW(window));
  95. }
  96. int main(int argc, char **argv)
  97. {
  98. GtkApplication *app;
  99. int status;
  100. app = gtk_application_new("org.nhrdev.timer", G_APPLICATION_FLAGS_NONE);
  101. g_signal_connect(app, "activate", G_CALLBACK(activate), nullptr);
  102. status = g_application_run(G_APPLICATION(app), argc, argv);
  103. g_object_unref(app);
  104. return status;
  105. }

字符串
试图在应用程序上添加key-press-event侦听器,但VS代码显示此错误,即使是编译器也
x1c 0d1x的数据
我的c_cpp_properties.json

  1. {
  2. "configurations": [
  3. {
  4. "name": "Linux",
  5. "compilerPath": "/usr/bin/g++-12",
  6. "includePath": [
  7. "${workspaceFolder}/**",
  8. "/usr/include/gtk-4.0",
  9. "/usr/include/gtk-4.0/gdk",
  10. "/usr/include/glib-2.0",
  11. "/usr/lib/x86_64-linux-gnu/glib-2.0/include",
  12. "/usr/include/pango-1.0",
  13. "/usr/include/harfbuzz",
  14. "/usr/include/cairo",
  15. "/usr/include/atk-1.0",
  16. "/usr/include/gdk-pixbuf-2.0",
  17. "/usr/include/graphene-1.0",
  18. "/usr/lib/x86_64-linux-gnu/graphene-1.0/include"
  19. ],
  20. "defines": [],
  21. "cppStandard": "gnu++23",
  22. "intelliSenseMode": "linux-gcc-x64",
  23. "browse": {
  24. "path": [
  25. "/usr/include"
  26. ]
  27. }
  28. }
  29. ],
  30. "version": 4
  31. }


我试着从Chat-GPT,Bard找到解决方案,但没有一个能提供任何工作解决方案

nom7f22z

nom7f22z1#

g_signal_connect(window,“key-press-event”,G_CALLBACK(onKeyPress),nullptr);

这不是创建控制器的方法。您的**G_CALLBACK(onKeyPress)是正确的,但“key-press-event”不是直接信号,它来自控制器。要创建控制器,您需要:
1.使用GtkEventController
gtk_event_controller_key_new(void)创建事件
1.将创建的事件(不是您的小部件)连接到G_CALLBACK。
1.将创建的事件添加到将包含它的小部件中,
gtk_widget_add_controller(GtkWidget
widget,GtkEventController* controller)

相关问题