undef не относится к типу Gtk2::Gdk::Drawable - пользовательский виджет gtk2-perl - вызывает метод окна GtkWidget

Я пытаюсь сделать собственный виджет Perl Gtk2. Когда я пытаюсь получить доступ к window свойство GtkDrawingArea, оно возвращает undef а не GdkDrawable объект. Согласно документации Gtk2-Perl, этот метод может возвращать либо объект окна, либо undef, но не ясно, при каких условиях он возвращается undef, Может ли кто-нибудь уточнить это?

#!/usr/bin/perl

use strict;
use warnings;

package Gtk2::MIDIPlot;

use Gtk2;
use base 'Gtk2::DrawingArea';
use Cairo;

sub new {
  my $class = shift;
  my $this = bless Gtk2::DrawingArea->new(), $class;

  $this->set_size_request(14400, 768);

  return $this;
}

sub draw {
  my $drawArea = shift;

  my $thisCairoSurface = Gtk2::Gdk::Cairo::Context->create($drawArea->window);
}

package main;

use Gtk2 -init;

my $window = Gtk2::Window->new();

my $mainWidgetScroll = Gtk2::ScrolledWindow->new();
my $mainWidget = Gtk2::MIDIPlot->new();
$mainWidget->draw($mainWidget);
$mainWidgetScroll->add_with_viewport($mainWidget);
$mainWindow->add($mainWidgetScroll);

$window->signal_connect(destroy => sub{Gtk2->main_quit()});
$window->show_all();
Gtk2->main();

0;

1 ответ

Решение

Глядя на этот пример, я обнаружил, что мне нужно подождать события expose виджета, прежде чем я смогу рисовать на нем, поскольку окно не было создано до этого события. Кроме того, код должен лучше соответствовать стилю настройки GTK, а затем выполнять действия в обратных вызовах.

#!/usr/bin/perl

use strict;
use warnings;

package Gtk2::MIDIPlot;

use Gtk2;
use base 'Gtk2::DrawingArea';
use Cairo;

sub new {
  my $class = shift;
  my $this = bless Gtk2::DrawingArea->new(), $class;

  $this->signal_connect(expose_event => 'Gtk2::MIDIPlot::draw');

  return $this;
}

sub draw {
  my $drawArea = shift;

  $drawArea->set_size_request(14400, 768);
  my $thisCairoSurface = Gtk2::Gdk::Cairo::Context->create($drawArea->get_window());
}
Другие вопросы по тегам