【问题标题】:Why does Gtk2::Builder mix up my signals?为什么 Gtk2::Builder 会混淆我的信号?
【发布时间】:2010-02-26 23:06:32
【问题描述】:

我有这个 perl 代码:

#!/usr/bin/perl

use warnings;
use strict;
use Data::Dumper;

use Gtk2 '-init';

my $data;

my $builder_file = "lists.glade";

my $builder = Gtk2::Builder->new();
$builder->add_from_file( $builder_file )
    or die "Couldn't read $builder_file";
$builder->connect_signals( undef );


my $window = $builder->get_object( "top_window" )
    or die "Error while setting up GUI";

$window->show_all();

# Dealloc builder
$builder = undef;

Gtk2->main();

sub top_window_destroy_cb
{
    Gtk2->main_quit();
}

sub on_radiobutton1_group_changed
{
    my ($self, $choice) = @_;

    print Dumper($self, $choice, $choice->get_text());
}

还有这个构建器文件:

<?xml version="1.0"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="top_window">
    <signal name="destroy" handler="top_window_destroy_cb"/>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkVButtonBox" id="vbuttonbox1">
            <property name="visible">True</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkRadioButton" id="radiobutton1">
                <property name="label" translatable="yes">Pera</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="active">True</property>
                <property name="draw_indicator">True</property>
                <signal name="group_changed" handler="on_radiobutton1_group_changed" object="choice"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkRadioButton" id="radiobutton2">
                <property name="label" translatable="yes">Mika</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="draw_indicator">True</property>
                <property name="group">radiobutton1</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="choice">
            <property name="visible">True</property>
            <property name="label" translatable="yes">Choice</property>
          </object>
          <packing>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

但它错误地将“on_radiobutton1_group_changed”与来自“top_window”的“destroy”信号连接起来。我知道这一点,因为它仅在关闭窗口时执行“打印 Dumper ...”语句。有谁知道我做错了什么?

【问题讨论】:

    标签: perl gtk glade gtkbuilder


    【解决方案1】:

    “组改变”信号

    当单选按钮所属的单选按钮组发生变化时发出。当单选按钮从单独切换为一组 2 个或更多按钮的一部分时发出,反之亦然,并且当一个按钮从一组 2 个或更多按钮移动到另一个按钮时,但不会在按钮所属组的组成发生变化。

    这听起来真的不像你想要的。我猜它是在销毁窗口时调用的。

    我添加了以下子

    sub on_radiobutton_toggled {
        my $self = shift;
        if ($self->get_active) {
            print Dumper($self, $self->get_label);
        }
    }
    

    并将每个单选按钮的切换信号(在 GtkToggleButton 下)设置为 on_radiobutton_toggled,它现在可以满足您的需求。

    【讨论】:

    • 我喜欢 perl-gtk2 的地方在于它与 C 接口的接近程度,因此即使所有示例代码都在 C 中,devhelp 也非常有用。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多