实现重叠的快捷方式

问题描述 投票:0回答:1

我正在尝试实现Ctrl + C快捷方式小部件,而不会干扰其他已定义的快捷方式。

问题

我的窗口看起来像这样:

  • GtkWindow
    • GtkEntry
    • GtkToggleButton

部分代码

// --- add checkbox ---
GtkWidget * checkbutton = gtk_check_button_new_with_label("My Checkbox");
gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(checkbutton));

// --- setup checkbox shortcut ---

GtkAccelGroup * accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);   

gtk_widget_add_accelerator(checkbutton, "clicked", accel_group, 
                          GDK_KEY_c, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); 
g_signal_connect(checkbutton, "clicked", G_CALLBACK(onCopyCheckbox), NULL);    
  // problem: this event fires, even if GtkEntry is focussed
  //          it then block the <kbd>Ctrl+C</kbd>-Event of GtkEntry

预期行为

  • 如果聚焦GtkEntry并按下Ctrl + C,则应触发函数callback1()。
  • 如果聚焦GtkToggleButton并按下Ctrl + C,它将打印“称为\ n的onCopyCheckbox()”。

实际行为

  • 如果聚焦GtkEntry并按下Ctrl + C,将打印“ onCopyCheckbox()称为\ n”,但不复制任何内容。
  • 如果聚焦GtkToggleButton并按下Ctrl + C,则将打印“被称为\ n的onCopyCheckbox()”。

请不要...

  • 告诉我,我应该使用其他快捷方式/加速器。

完整的可编译和可执行代码:

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

// ------------------------------------------------------------

void
onCopyCheckbox (GtkWidget      *widget,
                GdkDragContext *context,
                gpointer        user_data)
{
  printf("onCopyCheckbox() called\n");
}

// ------------------------------------------------------------

void fillWindow (GtkWindow * window)
{

  // ------- create layout ------------
  GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  gtk_container_add(GTK_CONTAINER(window),GTK_WIDGET(vbox)); 

  // --- add line edit --- 
  GtkWidget * lineedit = gtk_entry_new();
  gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(lineedit));

  // --- add checkbox ---
  GtkWidget * checkbutton = gtk_check_button_new_with_label("My Checkbox");
  gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(checkbutton));

  // --- setup checkbox shortcut ---

  GtkAccelGroup * accel_group = gtk_accel_group_new();
  gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);   

  gtk_widget_add_accelerator(checkbutton, "clicked", accel_group, 
                            GDK_KEY_c, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); 
  g_signal_connect(checkbutton, "clicked", G_CALLBACK(onCopyCheckbox), NULL);    
    // problem: this event fires, even if GtkEntry is focussed
    //          it then block the <kbd>Ctrl+C</kbd>-Event of GtkEntry

}

// ------------------------------------------------------------

int main(int argc, char *argv[]) {

  gtk_init(&argc, &argv);

  GtkWindow * window;
  {
    window = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (window, "Window title");
    gtk_window_set_default_size (window, 200, 200);
    g_signal_connect(window, "destroy", gtk_main_quit, NULL);
  }

  fillWindow(window);

  gtk_widget_show_all ((GtkWidget*)window);
  gtk_main();

  return 0;
}

// ------------------------------------------------------------
c gtk3
1个回答
0
投票

想象一下,当复选框处于焦点状态时,您想在Ctrl + C

© www.soinside.com 2019 - 2024. All rights reserved.