无法隐藏和显示窗口小部件以响应事件

莱昂哈德·普林兹

我有一个问题,其中通过gtk_widget_hide_on_delete用delete事件关闭小部件时,无法通过交换的gtk_widget_show_all并将相应的小部件作为参数传递给菜单小部件,再次显示菜单小部件。

我是Gtk + 3的新手,要学习它,我正在创建一个简单的程序,该程序由带有多个按钮小部件的选择菜单组成。按下一个将隐藏菜单,并显示一个包含标签和TextEntry的窗口小部件,此窗口小部件的delete事件将隐藏该小部件,然后再次显示菜单。

我创建了此代码的最小示例。简单的c文件会加载一个XML文件,其中包含显示和隐藏小部件所需的所有函数调用。

我依靠gtk_widget_show_all,gtk_widget_hide和gtk_widget_hide_on_delete,但是当我使用删除事件关闭运动小部件时,窗口消失了,但是菜单小部件没有显示。

C代码简单地加载XML文件,显示菜单小部件并进入主gtk循环。

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

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

    gtk_init(&argc, &argv);
    builder = gtk_builder_new();
    if (!gtk_builder_add_from_file(builder, "example.glade", &error)) {
        g_warning("%s", error->message);
        g_free(error);
        fprintf(stderr, "Failed to load build file");
    }

    menu = (GtkWidget *) gtk_builder_get_object(builder, "menu");

    gtk_builder_connect_signals(builder, NULL);
    gtk_widget_show(menu);

    gtk_main();

    return 0;
}

XML文件example.glade已使用Glade创建。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
  <requires lib="gtk+" version="3.10"/>
  <object class="GtkWindow" id="exercise">
    <property name="can_focus">False</property>
    <property name="window_position">center</property>
    <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
    <signal name="delete-event" handler="gtk_widget_show_all" object="menu" after="yes" swapped="yes"/>
    <child>
      <object class="GtkGrid" id="grid2">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="hexpand">True</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="hexpand">True</property>
            <property name="vexpand">True</property>
            <property name="label" translatable="yes">A window where stuff will happen.</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">0</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkWindow" id="menu">
    <property name="can_focus">False</property>
    <property name="window_position">center</property>
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/>
    <child>
      <object class="GtkGrid" id="grid1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button1</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="hexpand">True</property>
            <property name="vexpand">True</property>
            <signal name="clicked" handler="gtk_widget_hide" object="menu" swapped="yes"/>
            <signal name="clicked" handler="gtk_widget_show_all" object="exercise" swapped="yes"/>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">0</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button2">
            <property name="label" translatable="yes">button2</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="hexpand">True</property>
            <property name="vexpand">True</property>
            <signal name="clicked" handler="gtk_widget_hide" object="menu" swapped="yes"/>
            <signal name="clicked" handler="gtk_widget_show_all" object="exercise" swapped="yes"/>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>
用户名

问题出在您的Glade文件的这两行中:

<signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
<signal name="delete-event" handler="gtk_widget_show_all" object="menu" after="yes" swapped="yes"/>

纵观手册gtk_widget_hide_on_delete(),我们看到:

实用功能; 用于连接到GtkWindow上的“删除事件”信号。该函数调用gtk_widget_hide()其参数,然后返回TRUE

如果我们查看delete-event信号,则会看到:

退货

TRUE停止为该事件调用其他处理程序。FALSE进一步传播事件。

这意味着在gtk_widget_hide_on_delete()调用后,TRUE将返回,这将阻止GTK运行时调用gtk_widget_show_all()

要实现所需的功能,可以使用一个自定义的处理程序,如下所示:

  1. 删除这两行,并替换为以下内容:

    <signal name="delete-event" handler="my_custom_func" object="menu" swapped="no"/>
    
  2. 将您的自定义处理程序添加到C文件中:

    G_MODULE_EXPORT gboolean
    my_custom_func(GtkWidget *w, GdkEvent *e, gpointer u) {
        gtk_widget_hide(w);
        gtk_widget_show_all(GTK_WIDGET(u));
        return TRUE;
    }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Kivy中隐藏和显示小部件

仅在Wordpress窗口小部件中显示即将发生的事件

QTest无法将事件传递给子窗口小部件

Python:如何显示带有自定义内容,无窗口小部件和无事件循环的大窗口

Flutter自定义窗口小部件无法显示

隐藏和显示包含所有小部件的“QGridLayout”

隐藏和显示小部件时避免闪烁

R Shiny中的隐藏和显示小部件

自定义窗口小部件以显示价值和信息

窗口小部件单击无响应

在Flutter中是否可以在同一窗口小部件中显示图像和视频,是否有共同的窗口小部件?

如何使Entry小部件响应Activate事件

窗口小部件应根据下拉菜单中选择的选项显示或隐藏

根据用户的角色显示/隐藏小部件

隐藏/显示小部件的最佳方法

动动显示或隐藏小部件的动画

将图像背景添加到 gtk 3 窗口隐藏小部件和布局

Rss窗口小部件:数据不可显示

窗口小部件无法在屏幕底部对齐

无法从状态窗口小部件访问属性

窗口小部件Onclick无法正常工作

带有MVVM和init事件的Kendo自定义窗口小部件-如何?

小部件位置和窗口大小

Xcode 12.1 Emulator无法正确显示窗口小部件,如何解决?

使用AnimatedOpacity隐藏和显示复杂的小部件在Flutter中无效吗?

如何仅从首页隐藏WordPress小部件?但需要在帖子和页面上显示

使用pySide动态显示和隐藏选项卡小部件

如何在PyQt5中显示和隐藏小部件?

如何防止QSplitter完全隐藏子窗口小部件?