perl - 使用 Gtk2::EntryCompletion 和 Gtk2::SimpleList
问题描述
我正在处理Gtk2::SimpleList
用于不同字段的项目列表。其中一个字段应该是名称,我想Gtk2::EntryCompletion
用作字段的条目。
如何将新的列类型添加Gtk2::EntryCompletion
到 a Gtk2::SimpleList
?
解决方案
这是一个似乎对我有用的基本示例。有关更多信息,请查看示例程序
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();
推荐阅读
- android - Livedata观察者多次调用
- vba - VBA 对象参数不匹配类型
- git - 有没有办法在无缝提交 py 文件而不是 ipynb 的同时同时使用 Git 和 Jupyter 笔记本?
- c++ - 将 armv7m 指令翻译成 llvm IR
- python - 在 Python 中的点引用运算符中访问环境变量值
- javascript - Array.includes 在反应组件加载时返回冲突结果
- c - 分配和填充矩阵时出现分段错误
- oracle - "order by" postgres 和 oracle 有不同的结果
- html - 有没有办法在多个语言环境中使用 i18nSelect?
- postgresql - Postgres 13 存储过程可以返回多个类似于 SQL Server 的结果集吗?