【问题标题】:How to set cursor color in Gtk3 selectable label?如何在 Gtk3 可选标签中设置光标颜色?
【发布时间】:2021-08-29 14:01:31
【问题描述】:

我有一个使用 Gtk3 用 Perl 编写的程序,我在其中创建了一个我希望用户能够从中复制的可选标签。默认情况下,Gtk3 似乎假设用户想要使用键盘进行选择,因此每当您单击标签时它都会显示光标/插入符号。有没有一种方法可以将光标的颜色更改为不太明显的颜色或使其完全不可见,就像通常发生的情况一样,例如在 Firefox 中用于非输入字段?

我从 4 年前在这里看到了一个类似的问题,有人建议使用 override_cursorset_style 但现在使用 Gtk 3.24 似乎都已弃用。我尝试使用自定义 caret-color 属性定义 CSS 样式,但它似乎仅适用于 Entry 小部件,不适用于可选标签。无论我为所有类* 或仅为label 定义自定义插入符号颜色,我都会得到这种行为。其他 CSS 属性,例如 background-color 似乎工作正常。

一个额外的问题:Gtk3 参考手册建议使用GTK_STYLE_PROVIDER_PRIORITY_FALLBACKGTK_STYLE_PROVIDER_PRIORITY_USER 之间的值作为add_provider 的第二个参数。如何在 Perl 中编写这些常量?我尝试了 GTK_STYLE_PROVIDER_PRIORITY_FALLBACK 带和不带引号、"style-provider-priority-fallback""priority-fallback" 和许多其他组合,但 Perl 似乎都无法识别。

这是到目前为止我的代码的相关部分:

#!/usr/bin/perl
use Gtk3 -init;

my $window = Gtk3::Window->new('toplevel');
my $box = Gtk3::Box->new('horizontal',0);

my $label = Gtk3::Label->new();
$label->set_selectable(TRUE);
$label->set_label("Testing");

$box->pack_start($label, FALSE, FALSE, 5);

my $style = "* { caret-color: transparent; }";
my $css = Gtk3::CssProvider->new();
$css->load_from_data($style);

my $stylecontext = $label->get_style_context();
$stylecontext->add_provider($css,1);

$window->add($box);
$window->show_all;

Gtk3->main();

【问题讨论】:

    标签: css perl gtk3


    【解决方案1】:

    您可以使用gtk_style_context_add_class() 将自定义类添加到您的标签。例如:

    use strict;
    use warnings;
    use Glib qw(TRUE FALSE);
    use Gtk3 -init;
    
    my $window = Gtk3::Window->new('toplevel');
    $window->signal_connect( destroy  => sub { Gtk3->main_quit() } );
    my $box = Gtk3::Box->new('horizontal',0);
    my $label = Gtk3::Label->new();
    $label->set_selectable(TRUE);
    $label->set_label("Testing");
    $box->pack_start($label, FALSE, FALSE, 5);
    my $stylecontext = $label->get_style_context();
    $stylecontext->add_class("my_label");
    my $style = ".my_label { caret-color: transparent; }";
    my $css = Gtk3::CssProvider->new();
    $css->load_from_data($style);
    $stylecontext->add_provider($css, Gtk3::STYLE_PROVIDER_PRIORITY_USER);
    $window->add($box);
    $window->show_all;
    Gtk3->main();
    

    这也说明了如何获取常量GTK_STYLE_PROVIDER_PRIORITY_USER的值。

    【讨论】:

    • 谢谢,似乎解决了我的问题!有趣的是,它需要一个命名类才能工作。知道为什么会这样吗?如果我将其定义为“label { car​​et-color: transparent; }”,是否会覆盖 CSS?
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2015-04-22
    • 2015-09-04
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多