【问题标题】:How to set the background color in a Gtk3::TreeViewColumn?如何在 Gtk3::TreeViewColumn 中设置背景颜色?
【发布时间】:2020-09-06 03:51:52
【问题描述】:

我尝试在Gtk3::TreeViewColumn 中设置背景颜色:

my $red = Gtk3::Gdk::RGBA->new(1, 0.8, 0.8, 1);
my $renderer = Gtk3::CellRendererText->new;
my $column = Gtk3::TreeViewColumn->new_with_attributes
    ($c, $renderer, text => $n, background => $red);

但我得到了错误:

Gtk-CRITICAL **: 09:54:09.834: gtk_list_store_get_value: assertion 'column < priv->n_columns' failed
GLib-GObject-CRITICAL **: g_value_transform: assertion 'G_IS_VALUE (src_value)' failed at /usr/share/perl5/Gtk3.pm line 568.
GLib-GObject-WARNING **: unable to set property 'background' of type 'gchararray' from value of type '(null)' at /usr/share/perl5/Gtk3.pm line 568.

当我以这种方式创建颜色时,我得到了同样的错误:

my $red2 = Gtk3::Gdk::RGBA::parse ('#FF0000');

谁能解释一下如何设置背景颜色?

完整示例:

#! /usr/bin/perl
use strict;
use warnings;
use utf8;

use Gtk3 -init;
use Glib 'TRUE', 'FALSE';

my @COLUMNS = (
  'a',
  'b',
  'c');

my $red = Gtk3::Gdk::RGBA->new(1, 0, 0, 1);
my $red2 = Gtk3::Gdk::RGBA::parse ('#F00');

my $window = Gtk3::Window->new ('toplevel');

my $notebook = Gtk3::Notebook->new;
$window->add($notebook);

my $sw = Gtk3::ScrolledWindow->new (undef, undef);
$notebook->append_page ($sw, Gtk3::Label->new ("tab"));

my $model = Gtk3::ListStore->new (('Glib::String') x scalar @COLUMNS);

my $row = $model->append ();
$model->set ($row,
             0, "a",
             1, "b",
             2, "c");

my $treeview = Gtk3::TreeView->new($model);
$sw->add($treeview);

while (my ($n, $c) = each @COLUMNS) {
  my $renderer = Gtk3::CellRendererText->new;
  my $column = Gtk3::TreeViewColumn->new_with_attributes
      ($c, $renderer, text => $n, background => $red);
  $treeview->append_column($column);
}

$window->show_all;
Gtk3->main();

【问题讨论】:

    标签: perl gtk3


    【解决方案1】:

    问题出在这一行:

    my $column = Gtk3::TreeViewColumn->new_with_attributes
      ($c, $renderer, text => $n, background => $red);
    

    这里,background 属性需要 Gtk3::ListStore 索引,但您没有提供整数索引,而是提供了 RGBA 对象 $red

    这是一个示例,说明如何通过将虚拟列添加到包含颜色为 RGB 字符串的 Gtk::ListStore 来实现:

    use feature qw(say);
    use strict;
    use warnings;
    use Gtk3 -init;
    use Glib 'TRUE', 'FALSE';
    
    my @COLUMNS = qw( a b c );
    my $ncols = scalar @COLUMNS;
    
    my $red = "#f00";
    my $window = Gtk3::Window->new ('toplevel');
    my $notebook = Gtk3::Notebook->new;
    $window->add($notebook);
    my $sw = Gtk3::ScrolledWindow->new (undef, undef);
    $notebook->append_page ($sw, Gtk3::Label->new ("tab"));
    
    my $model = Gtk3::ListStore->new ((('Glib::String') x $ncols), 'Glib::String');
    my $row = $model->append ();
    $model->set ($row, (map {($_, $COLUMNS[$_])} 0..$#COLUMNS), $ncols, $red);
    my $treeview = Gtk3::TreeView->new($model);
    $sw->add($treeview);
    while (my ($n, $c) = each @COLUMNS) {
      my $renderer = Gtk3::CellRendererText->new;
      my $column = Gtk3::TreeViewColumn->new_with_attributes
          ($c, $renderer, text => $n, background => $ncols);
      $treeview->append_column($column);
    }
    $window->signal_connect( destroy  => sub { Gtk3->main_quit() } );
    $window->show_all;
    Gtk3->main();
    

    另见Python 3 and Gtk+3 - issue with TreeView and alternate colors of rows

    【讨论】:

      【解决方案2】:

      RGBA 表示 4 个值,分别称为 RED、GREEN、BLUE、ALPHA(别名透明度)。

      如果您只有 RGB,请在 00..FF (min..max) 范围内添加缺失的 A。

      现在再次正确调用您的线路!

      模型(a、b、c、d)

      我的 $red2 = Gtk3::Gdk::RGBA::parse ('#FF000000');

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 1970-01-01
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 2016-03-16
        相关资源
        最近更新 更多