如何在 Gtk3 可选标签中设置光标颜色?

Posted

技术标签:

【中文标题】如何在 Gtk3 可选标签中设置光标颜色?【英文标题】:How to set cursor color in Gtk3 selectable label? 【发布时间】: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();

【问题讨论】:

【参考方案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?

以上是关于如何在 Gtk3 可选标签中设置光标颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash shell中设置光标颜色[重复]

如何在 Java 中设置标签(彩色文本)的颜色?

如何在 Nativescript HtmlView 标签中设置链接颜色?

如何在更多视图控制器的导航栏中设置图像并将更多标签的颜色从白色更改为绿色..?

iOS开发中设置UITextField的占位文字的颜色,和光标的颜色

如何解析包含样式、颜色、字体系列、字体大小等 Html 标签的数据,并在 android 的 textview 中设置