微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

子菜单级别中的 GtkMenu 无法在 ubuntu 20.04

如何解决子菜单级别中的 GtkMenu 无法在 ubuntu 20.04

最近,我将我的代码从 ubuntu 14.04 升级到 20.04。 UI 似乎工作正常,但带有触摸面板的子菜单。 我按下菜单并选择 menuitem2 并显示菜单, 当我点击触摸屏打开子菜单时,它没有反应。

我编写了一个代码来检查,发现当我点击触摸屏时发送的是“选择”信号而不是“活动”信号。 (使用鼠标单击时代码工作正常) 有没有人可以帮我解决这个问题?或者有没有其他 GtkWidget 可以用来代替 GtkMenu?

任何意见和建议将不胜感激。

Brlow 是我的代码

/* 
 * Build:
 * gcc $(pkg-config --cflags gtk+-3.0) popover_sample.c -o popover_sample $(pkg-config --libs gtk+-3.0)
 */

#include <stddef.h>
#include <gtk/gtk.h>


void on_ITEM2_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_ITEM2_activate \n");
}

void on_SEC_2_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_SEC_2_activate \n");
}


void on_SEC_1_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_SEC_1_activate \n");
}

void on_submenuitem1_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_submenuitem1_activate \n");
}

void on_submenuitem2_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_submenuitem2_activate \n");
}


void on_submenuitem3_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_submenuitem3_activate \n");
}

void on_submenuitem4_activate(GtkMenuItem* button,gpointer user_data)
{
    printf("on_submenuitem4_activate \n");
}


// called when window is closed
void on_QUIT_BTN_clicked()
{
    gtk_main_quit();
}


void on_btn1_clicked(GtkMenuItem* button,gpointer user_data)
{
    gtk_main_quit();
}

void on_ITEM1_activate(GtkMenuItem* button,gpointer user_data)
{
    GtkWidget *open_item;   // New menuitem
    GtkWidget *save_item;   // New menuitem
    GtkWidget *quit_item;   // New menuitem
    GtkWidget *sep;      // New sep
    GtkWidget *ITEM1_Menu;  // New menu

    ITEM1_Menu = gtk_menu_new();

    open_item = gtk_menu_item_new_with_label ("Open");
    save_item = gtk_menu_item_new_with_label ("Save");
    quit_item = gtk_menu_item_new_with_label ("Quit");
    sep = gtk_separator_menu_item_new();

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(button),ITEM1_Menu);
    gtk_menu_shell_append(GTK_MENU_SHELL(ITEM1_Menu),open_item);
    gtk_menu_shell_append(GTK_MENU_SHELL(ITEM1_Menu),save_item);
    gtk_menu_shell_append(GTK_MENU_SHELL(ITEM1_Menu),sep);
    gtk_menu_shell_append(GTK_MENU_SHELL(ITEM1_Menu),quit_item);


    g_signal_connect_swapped (G_OBJECT (open_item),"activate",G_CALLBACK (on_submenuitem1_activate),NULL);
    g_signal_connect_swapped (G_OBJECT (save_item),G_CALLBACK (on_submenuitem2_activate),NULL);

    g_signal_connect_swapped (G_OBJECT (quit_item),G_CALLBACK (on_QUIT_BTN_clicked),NULL);

    gtk_widget_show (open_item);
    gtk_widget_show (save_item);
    gtk_widget_show (quit_item);
    gtk_widget_show (sep);

    printf("on_ITEM1_activate \n");
}



int main(int argc,char *argv[])
{
    GtkBuilder      *builder;
    GtkWidget       *window;
    GError *error = NULL;

    gtk_init(&argc,&argv);

    builder = gtk_builder_new();

    if (gtk_builder_add_from_file (builder,"Menu_Test.glade",&error) == 0)
    {
        printf("Unable to open file named \"Menu_Test.glade\" \n");
        return 1;
    }

    window = GTK_WIDGET(gtk_builder_get_object(builder,"test_win"));
    if (NULL == window)
    {
        printf("Unable to file object with id \"test_win\" \n");
    }

    g_signal_connect (window,"destroy",G_CALLBACK (gtk_main_quit),NULL);
    window = GTK_WIDGET(gtk_builder_get_object(builder,"test_win"));
    

    gtk_builder_connect_signals(builder,NULL);
    g_object_unref(builder);
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

和下面的林间空地:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkMenu" id="menu1">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <child>
      <object class="GtkMenuItem" id="menuitem1">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="tooltip-text" translatable="yes">ITEM_1</property>
        <property name="label" translatable="yes">menuitem1</property>
        <property name="use-underline">True</property>
        <signal name="select" handler="on_ITEM1_activate" swapped="no"/>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="menuitem2">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="tooltip-text" translatable="yes">ITEM_2</property>
        <property name="label" translatable="yes">menuitem2</property>
        <property name="use-underline">True</property>
        <signal name="activate" handler="on_ITEM2_activate" swapped="no"/>
        <child type="submenu">
          <object class="GtkMenu" id="menu2">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <child>
              <object class="GtkMenuItem" id="submenuitem3">
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="tooltip-text" translatable="yes">Item_2_1</property>
                <property name="label" translatable="yes">menuitem3</property>
                <property name="use-underline">True</property>
                <signal name="activate" handler="on_submenuitem3_activate" swapped="no"/>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem" id="submenuitem4">
                <property name="name">submenuitem4</property>
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="tooltip-text" translatable="yes">Item_2_2</property>
                <property name="label" translatable="yes">menuitem4</property>
                <property name="use-underline">True</property>
                <signal name="activate" handler="on_submenuitem4_activate" swapped="no"/>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkWindow" id="test_win">
    <property name="width-request">300</property>
    <property name="height-request">300</property>
    <property name="can-focus">False</property>
    <child>
      <object class="GtkBox" id="Box1">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <property name="spacing">76</property>
        <child>
          <object class="GtkMenuButton" id="menubutton1">
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="receives-default">True</property>
            <property name="popup">menu1</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <placeholder/>
        </child>
        <child>
          <object class="gtkbutton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="receives-default">True</property>
            <property name="halign">center</property>
            <property name="valign">baseline</property>
            <signal name="clicked" handler="on_QUIT_BTN_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

解决方法

将 gtk 库升级到 3.24.28 版本后。这个问题解决了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。