Ok. 나는 며칠 동안 이것에 갇혀 있었고 나는 여기서 끝내고있다. 나는 결코 펄의 전문가는 아니다.Wxwidgets/Wx Perl 그리드 사이징 문제
나는 WxPerl을 사용하여 GUI 응용 프로그램을 작성하고 있습니다. 소음을 줄이기 위해 문제가있는 앱의 일부를 다시 만들었습니다. FormBuilder에서 레이아웃을 디자인 한 다음 결과 XRC 파일을 사용했습니다. XRC 데이터는 아래에 포함되어 있으며 noname.xrc라는 파일에 저장됩니다.
GUI에는 가운데에 두 개의 버튼이있는 두 개의 격자 (왼쪽 및 오른쪽)가 있습니다. 테스트를 위해 메인 프레임 상단에 "행 추가"버튼이 있는데,이 버튼은 왼쪽 그리드에 행을 추가합니다. 나는 EVT_SIZE 함수를 작성하여 왼쪽에 그리드의 마지막 열을 조정하여 나머지 공간을 채우고 오른쪽에있는 그리드를 수정하여 같은 비율로 유지합니다.
문제 :
1) 다음 주 프레임 창 크기를 조정, 추가 버튼을 20 번 누릅니다. 그리드가 갑자기 확장되어 프레임의 전체 하단을 어떻게 먹는 지 확인하십시오. 추가 버튼을 몇 번 더 클릭하면 바닥을 계속 먹습니다. 바닥 부분을 먹지 못하도록 높이를 조절할 수 없습니다. 아마도 내가 놓친 분명한 형태가있을 수 있습니까? wxGridBagSizer에서 growablecols 플래그를 제거해도 이것이 발생하지 않습니다.
2) 귀찮은 시각적 문제입니다. 이는 비례 사이징과 관련이 있습니다. 기본적으로 그리드 (5x2)의 각면에 테두리가 채워져 있는데, 이는 10입니다. 따라서 설정하기 전에 폭에서 11을 뺀 것이지만 이상적으로는 10이어야합니다. 그러나 크기를 10으로 설정하면 크기를 조정할 때 마지막 열이 영원히 계속 자랍니다 ...
3) 메인 프레임의 오른쪽 상단 모서리에있는 "최대화"버튼을 클릭 한 다음 다시 클릭하십시오 ("복원 다운"이라고 함). 이전 크기로 돌아 가면 왼쪽 눈금이 EVT_SIZE 이벤트를 트리거하지 않는 크기를 변경하지 않았기 때문에 오른쪽 눈금이 결코 분명히 조정되지 않는 것을 볼 수 있습니다.이 문제를 해결하는 방법을 브레인 스토밍했습니다. 크기 이벤트는 오른쪽 그리드의 위치를 확인하고 메인 프레임 너비를 초과하는지 판단 할 수 있습니까? 크기를 적절히 설정하는 쉬운 방법이 있습니까?
이상적으로, 특정 격자 열에 최소 크기를 설정하고 싶지만 주 창 크기를 조정할 때 모든 열이 커지게하십시오. 그러나 그것은 아마도 현재 파이프 꿈 일 것입니다.
#!/usr/bin/perl
package wxToplevelFrame;
use strict;
use warnings;
use Wx qw(:everything);
use Wx::Grid;
use Wx::XRC;
use base 'Wx::Frame';
use Data::Dumper;
use diagnostics;
# import event registration function
use Wx::Event qw(:everything);
use base qw(Wx::Panel Class::Accessor::Fast);
__PACKAGE__->mk_ro_accessors(qw(xrc));
$| = 1;
### GUI CODE BEGINS ###
# create specialized constructor for new subclass
sub new {
my $class = shift;
my $self = $class->SUPER::new();
$self->initialize();
return $self;
}
sub initialize {
my ($self) = @_;
my $xrc_path = 'noname.xrc';
Wx::InitAllImageHandlers();
$self->{ xrc } = Wx::XmlResource->new();
$self->xrc->InitAllHandlers();
$self->xrc->Load($xrc_path);
$self->xrc->LoadFrame($self, undef, 'MyFrame1',);
# main frame close
EVT_CLOSE($self,
sub {
my ($self) = @_;
$self->Destroy();
}
);
# LEFT GRID
my $grid_left = $self->{ grid_left } = $self->FindWindow('m_grid4');
$grid_left->CreateGrid(0, 3);
$grid_left->SetColLabelSize(25); # label height
$grid_left->SetRowLabelSize(25); # row width (far left, the numbers column basically)
$grid_left->SetColLabelValue(0, 'col_1');
$grid_left->SetColLabelValue(1, 'col_2');
$grid_left->SetColLabelValue(2, 'col_3');
$grid_left->EnableDragColSize(0);
$grid_left->EnableDragRowSize(0);
$grid_left->EnableEditing(0);
$grid_left->SetDefaultRowSize(20);
$grid_left->SetColSize(0, 190); # col 1
$grid_left->SetColSize(1, 50); # col 2
$grid_left->SetColSize(2, 179); # col 3
# RIGHT GRID
my $grid_right = $self->{ grid_right } = $self->FindWindow('m_grid5');
$grid_right->CreateGrid(0, 3);
$grid_right->SetColLabelSize(25); # label height
$grid_right->SetRowLabelSize(25); # row width (far left, the numbers column basically)
$grid_right->SetColLabelValue(0, 'col_');
$grid_right->SetColLabelValue(1, 'col_2');
$grid_right->SetColLabelValue(2, 'col_3');
$grid_right->EnableDragColSize(0);
$grid_right->EnableDragRowSize(0);
$grid_right->EnableEditing(0);
$grid_right->SetDefaultRowSize(20);
$grid_right->SetColSize(0, 190); # col 1
$grid_right->SetColSize(1, 50); # col 2
$grid_right->SetColSize(2, 179); # col 3
#EVT_SIZE($grid_left, \&on_size); # adjust grid when size changes
#EVT_SIZE($grid_right, \&on_size); # adjust grid when size changes
my $on_size = \&on_size;
EVT_SIZE($grid_left, callback($on_size, $self, $grid_left));
my $button = $self->{ button } = $self->FindWindow('m_button3');
EVT_BUTTON(
$button,
$button->GetId(),
callback(my $button_sub = \&add_row, $self, $button),
);
my $gui_actions_text_ctrl = $self->FindWindow('m_textCtrl1');
my $gui_log = Wx::LogTextCtrl->new($gui_actions_text_ctrl);
$self->{ gui_log_text_ctrl } = Wx::Log::SetActiveTarget($gui_log);
$self->SetStatusBarPane(-1);
return;
}
sub callback {
my $coderef = shift;
my @args = @_;
#print "what is args\n";
#print Dumper \@args;
sub { $coderef->(@args) }
# callback function. when we want to pass addition args to a method call, such as an event (EVT_*), we can use this
# example:
# my $on_size_test = \&on_size_test;
# EVT_SIZE($grid_left, callback($on_size, $grid_left, $self));
}
sub on_close {
my ($self) = @_;
$self->Destroy();
}
sub on_size {
my ($self, $grid) = @_;
print "in on_size sub\n";
# get the number of columns and the initial width which includes the far left number column (gutter column, with row indicators 1, 2, 3 ...)
my $num_cols = $grid->GetNumberCols();
my $width = $grid->GetRowLabelSize();
my $gutter_col = $width;
print "num_cols: $num_cols\n";
print "initial width: $width\n";
my $col_0;
my $col_1;
my $col_2;
# iterate over each column, get size and add it to our width
for (my $col = 0; $col < $num_cols; $col++) {
# conditionals of no importance currently, but used during testing
if ($col == 0) {
$col_0 = $grid->GetColSize($col);
print "col: $col, width col_0: $col_0\n";
} elsif ($col == 1) {
$col_1 = $grid->GetColSize($col);
print "col: $col, width col_1: $col_1\n";
} elsif ($col == 2) {
$col_2 = $grid->GetColSize($col);
print "col: $col, width col_2: $col_2\n";
}
$width += $grid->GetColSize($col);
}
print "width after iterating over each column: $width\n";
# get sizer that grid is contained in
# get width of sizer and subtract it from the total width
# the difference will be the size we set for our last column
if ($num_cols > 0) {
my $static_box_sizer = $grid->GetContainingSizer();
my $sizer = $static_box_sizer->GetSize();
my $sizer_width = $sizer->GetWidth();
print "sizer_width: $sizer_width\n";
print "we are setting width for the last column. sizer_width: $sizer_width minus the total width: $width (gutter_col: $gutter_col, col_0, col_1, col_2)\n";
my $width_diff = $sizer_width - $width + $col_2 - 11; # ideally this should be 10 for padding (5x2) on each side of sizer
# but setting it at 10 causes the col to keep expanding...
print "width_diff result of above calc: $width_diff\n";
$grid->SetColSize($num_cols - 1, $width_diff); # last column
# adjust grid right to reflect same proportions
$self->{ grid_right }->SetColSize($num_cols - 1, $width_diff); # last column
}
return;
}
sub add_row {
my ($self, $button) = @_;
$self->{ grid_left }->AppendRows(1);
my $col = 0;
foreach my $value ('testing', 100, 'Sat Aug 20 20:52:20 2016') {
my $row;
if ($col == 3) {
$self->{ grid_left }->AppendRows(1);
$row = $self->{ grid_left }->GetNumberRows() - 1; # minus one from total rows
print "col == 2\n";
print "reset\n";
print "what is row: $row\n";
$col = 0;
} else {
$row = $self->{ grid_left }->GetNumberRows() - 1;
}
print "value: $value\n";
$self->{ grid_left }->SetCellValue(
$row,
$col,
$value,
);
if ($col == 1) {
$self->{ grid_left }->SetCellAlignment(
$row,
$col,
wxALIGN_RIGHT,
wxALIGN_CENTRE,
);
} elsif ($col == 2) {
$self->{ grid_left }->SetCellAlignment(
$row,
$col,
wxALIGN_CENTRE,
wxALIGN_CENTRE,
);
}
$col++;
}
}
### GUI CODE ENDS ###
# END: wxToplevelFrame package
# create an app object
package MyApp;
use strict;
use warnings;
use base 'Wx::App';
# OnInit is called automatically when an app object is first constructed
sub OnInit {
my $self = shift;
my $toplevel_frame = wxToplevelFrame->new();
$self->SetTopWindow($toplevel_frame);
$toplevel_frame->Show(1);
}
# END: MyApp package
package main;
use strict;
use warnings;
use Data::Dumper;
$| = 1;
my $app = MyApp->new(); # instantiate our app first
$app->MainLoop();
exit;
XRC 파일 :
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
<object class="wxFrame" name="MyFrame1">
<style>wxCAPTION|wxCLOSE_BOX|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU|wxFULL_REPAINT_ON_RESIZE|wxTAB_TRAVERSAL</style>
<size>998,700</size>
<title>Grid Issues</title>
<centered>1</centered>
<aui_managed>0</aui_managed>
<object class="wxPanel" name="m_panel6">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>1</option>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxFlexGridSizer">
<rows>0</rows>
<cols>6</cols>
<vgap>0</vgap>
<hgap>0</hgap>
<growablecols></growablecols>
<growablerows></growablerows>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="m_button3">
<label>add row</label>
<default>0</default>
</object>
</object>
</object>
</object>
<object class="sizeritem">
<option>3</option>
<flag>wxEXPAND|wxLEFT|wxRIGHT</flag>
<border>5</border>
<object class="wxGridBagSizer">
<vgap>0</vgap>
<hgap>0</hgap>
<growablecols>0,2</growablecols>
<growablerows>0</growablerows>
<object class="sizeritem">
<cellpos>0,0</cellpos>
<cellspan>1,1</cellspan>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxStaticBoxSizer">
<orient>wxHORIZONTAL</orient>
<label>left</label>
<object class="sizeritem">
<option>1</option>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxGrid" name="m_grid4" />
</object>
</object>
</object>
<object class="sizeritem">
<cellpos>0,1</cellpos>
<cellspan>1,1</cellspan>
<flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
<border>5</border>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="m_button4">
<style>wxBU_EXACTFIT</style>
<label>></label>
<default>0</default>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="m_button5">
<style>wxBU_EXACTFIT</style>
<label><</label>
<default>0</default>
</object>
</object>
</object>
</object>
<object class="sizeritem">
<cellpos>0,2</cellpos>
<cellspan>1,1</cellspan>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxStaticBoxSizer">
<orient>wxHORIZONTAL</orient>
<label>right</label>
<object class="sizeritem">
<option>1</option>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxGrid" name="m_grid5" />
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem">
<option>2</option>
<flag>wxEXPAND | wxALL</flag>
<border>5</border>
<object class="wxNotebook" name="m_notebook2">
<object class="notebookpage">
<label>a page</label>
<selected>0</selected>
<object class="wxPanel" name="m_panel2">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>1</option>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxTextCtrl" name="m_textCtrl1">
<value></value>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="wxStatusBar" name="m_statusBar1">
<style>wxST_SIZEGRIP</style>
<fields>2</fields>
</object>
</object>
</resource>
크게 감사합니다 어떤 도움 noname.xrc, 너무 많은 코드가 여기에있다
-Jdun
답장 VZ를 보내 주셔서 감사합니다. 나는 이것을 재검토하고 제안을 시도해 볼 수 있습니다.계속 전진해야했고 크기 조정 문제를 해결하기 위해 양식을 잠그면 크기 조정 문제를 해결하고 세로 스크롤 막대를 차지했습니다. – Jdun