首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Gtk2::EntryCompletion与Gtk2::SimpleList一起使用

将Gtk2::EntryCompletion与Gtk2::SimpleList一起使用
EN

Stack Overflow用户
提问于 2021-07-15 17:06:41
回答 1查看 26关注 0票数 1

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

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

EN

回答 1

Stack Overflow用户

发布于 2021-07-16 01:24:35

这里有一个基本的例子,似乎对我很有效。有关更多信息,请查看example programs

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68390960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档