首页 > 解决方案 > 使用 Gtk2::EntryCompletion 和 Gtk2::SimpleList

问题描述

我正在处理Gtk2::SimpleList用于不同字段的项目列表。其中一个字段应该是名称,我想Gtk2::EntryCompletion用作字段的条目。

如何将新的列类型添加Gtk2::EntryCompletion到 a Gtk2::SimpleList

标签: perlgtk2

解决方案


这是一个似乎对我有用的基本示例。有关更多信息,请查看示例程序

package MyEntry;
use feature qw(say);
use strict;
use warnings;
use Glib qw/TRUE FALSE/;
use Gtk2;
use base qw(Gtk2::Entry);

use Glib::Object::Subclass Gtk2::Entry::, interfaces => [ Gtk2::CellEditable:: ];

sub set_text {
    my ( $self, $text) = @_;
    $self->get_buffer->set_text ($text);
}

sub START_EDITING { }
sub EDITING_DONE { }
sub REMOVE_WIDGET { }

package CellRendererEntry;
use feature qw(say);
use strict;
use warnings;

use Glib qw/TRUE FALSE/;
use Gtk2;
use Gtk2::Gdk::Keysyms;

use Glib::Object::Subclass
    "Gtk2::CellRendererText",
;

# Creates a tree model containing the completions
sub create_completion_model {
    my $store = Gtk2::ListStore->new (Glib::String::);
    my @words = qw(perl python java javascript c c++ ruby go haskell lisp php);
    for my $word (@words) {
        $store->set ($store->append, 0, $word);
    }
    return $store;
}

sub START_EDITING {
    my ($cell, $event, $view, $path, $background_area, $cell_area, $flags) = @_;

    my $entry = MyEntry->new;
    $entry->set_text ($cell->get('text'));
    $entry->grab_focus;
    my $completion = Gtk2::EntryCompletion->new;
    $entry->set_completion ($completion);
    $completion->set_model (create_completion_model ());
    $completion->set_text_column (0);
    $entry->signal_connect (key_press_event => sub {
          my ($widget, $event) = @_;
          if ($event->keyval == $Gtk2::Gdk::Keysyms{Return}) {
              $cell->signal_emit (edited => $path, $entry->get_text);
              $entry->destroy;
              return TRUE;
          }
          return FALSE;
     });
    # Make sure the entry has the correct height.  On some versions of
    # gtk+, the entry would otherwise be just a few pixels tall.
    $entry->set (height_request => $cell_area->height);
    $entry->show;
    return $entry;
}

package main;
use feature qw(say);
use strict;
use warnings;

use Data::Printer;
use Glib qw(TRUE FALSE);
use Gtk2 '-init';
use Gtk2::SimpleList;

my $window = Gtk2::Window->new('toplevel');
$window->set_title('SimpleList test');
$window->set_position('center');
$window->set_default_size(450, 350);
$window->signal_connect(
    'delete-event' =>
    sub {
        Gtk2->main_quit();
        exit;
    });

my $vb = Gtk2::VBox->new(0, 6);
$window->add($vb);

my $sw = Gtk2::ScrolledWindow->new;
$sw->set_policy (qw/automatic automatic/);
$vb->pack_start($sw, 1, 1, 0);

Gtk2::SimpleList->add_column_type(
    'entry_completion',
    type     => 'Glib::String',
    renderer => 'CellRendererEntry',
    attr     => 'text',
);

my $list = Gtk2::SimpleList->new(
    'Text Field'    => 'entry_completion',
    'Int Field'     => 'int',
    'Double Field'  => 'double',
    'Bool Field'    => 'bool',
);
@{$list->{data}} = (
        [ 'text', 1, 1.1,  TRUE ],
        [ 'text', 2, 2.2, FALSE ],
    );
$list->set_column_editable (0, TRUE);
$sw->add($list);
my $quitbtn = Gtk2::Button->new_from_stock('gtk-quit');
$quitbtn->signal_connect( clicked => sub { Gtk2->main_quit; 1 } );
$vb->pack_start($quitbtn, 0, 0, 0);
$window->show_all();
Gtk2->main();

推荐阅读