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

使用 Gtk2::EntryCompletion 和 Gtk2::SimpleList

如何解决使用 Gtk2::EntryCompletion 和 Gtk2::SimpleList

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

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

解决方法

这是一个似乎对我有用的基本示例。有关详细信息,请查看 example programs

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,$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,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,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);
$window->show_all();
Gtk2->main();

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