Re: Memory fault when inserting QTableItem into QTable

Oliver Kreuer <[email protected]>
Newsgroups gmane.comp.kde.devel.perl
Message-ID <[email protected]>
Hello Richard,

I appended two example scripts with input files.
Script "table_fault.pl" reproduces the memory fault whereas 
"table_ok.pl" contains a work around. The work around is not very 
pleasant so I'm still interested why this memory fault occurs.
Due to bug #924345 the work around has to use takeItem insted of removeRow.

Oliver

Richard Dale wrote:
> On Monday 05 July 2004 14:42, Oliver Kreuer wrote:
> 
>>Hello,
>>
>>I've written the following small Perl/Qt program:
>>
>>...
>>table = Qt::Table(frame6, "table");
>>table->setNumRows( int(0) );
>>table->setNumCols( int(0) );
>>table->setReadOnly( 1 );
>>table->setSelectionMode( &Qt::Table::NoSelection() );
>>table->setLeftMargin(0);
>>...
>>open (FILE,"table_example.one") or die;
>>while (defined (my $line = <FILE>))
>>{
>>     chomp($line);
>>     push (@lines,$line);
>>
>>     clearTable();
>>
>>     table->setNumCols(1);
>>     table->horizontalHeader()->setStretchEnabled(1);
>>     table->horizontalHeader()->setLabel(0,"Eine Spalte",-1);
>>     table->setNumRows(scalar(@lines));
>>
>>     my $row = 0;
>>    foreach my $element (@lines)
>>    {
>>
>>table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never,"
>>$element"));
>>        $row++;
>>    }
>>}
>>
> 
> Shouldn't the code above look something like this? I'm not sure if that is the 
> cause of the problem - would you be able to post a complete program/input 
> file that reproduces the bug?
> 
> open (FILE,"table_example.one") or die;
> while (defined (my $line = <FILE>))
>  {
>       chomp($line);
>       push (@lines,$line);
> 
> 
>  }
>       clearTable();
>      table->setNumCols(1);
>       table->horizontalHeader()->setStretchEnabled(1);
>       table->horizontalHeader()->setLabel(0,"Eine Spalte",-1);
>       table->setNumRows(scalar(@lines));
> 
>       my $row = 0;
>      foreach my $element (@lines)
>      {
> 
>  table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never,"
>  $element"));
>          $row++;
>      }
> _______________________________________________
> Kde-perl mailing list
> [email protected]
> https://mail.kde.org/mailman/listinfo/kde-perl

_______________________________________________
Kde-perl mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-perl
table_example.one (text/plain, 19 B)
One
Two
Three
Four
table_example.two (text/plain, 32 B)
1_1	1_2
2_1	2_2
3_1	3_2
4_1	4_2
table_fault.pl (application/x-perl, 4 KB)
#!/usr/bin/perl -w

use strict;
use utf8;
#use Qt::debug qw(all);

package table_example;
use Qt;
use Qt::isa qw(Qt::Widget);
use Qt::slots
    tableOneRow => [],
    tableTwoRows => [];
use Qt::attributes qw(
    frame6
    One_Row
    table
    Two_Rows
);


sub NEW
{
    shift->SUPER::NEW(@_[0..2]);

    if ( name() eq "unnamed" )
    {
        setName("table_example" );
    }

    my $table_exampleLayout = Qt::GridLayout(this, 1, 1, 11, 6, '$table_exampleLayout');

    frame6 = Qt::Frame(this, "frame6");
    frame6->setFrameShape( &Qt::Frame::StyledPanel() );
    frame6->setFrameShadow( &Qt::Frame::Raised() );
    my $frame6Layout = Qt::GridLayout(frame6, 1, 1, 11, 6, '$frame6Layout');
    my $spacer = Qt::SpacerItem(190, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum);
    $frame6Layout->addItem($spacer, 1, 3);

    One_Row = Qt::PushButton(frame6, "One_Row");

    $frame6Layout->addWidget(One_Row, 1, 1);

    table = Qt::Table(frame6, "table");
    table->setNumRows( int(0) );
    table->setNumCols( int(0) );
    table->setReadOnly( 1 );
    table->setSelectionMode( &Qt::Table::NoSelection() );
    table->setLeftMargin(0);                               # don't show left vertical header

    $frame6Layout->addMultiCellWidget(table, 0, 0, 0, 3);

    Two_Rows = Qt::PushButton(frame6, "Two_Rows");

    $frame6Layout->addWidget(Two_Rows, 1, 2);
    my $spacer_2 = Qt::SpacerItem(190, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum);
    $frame6Layout->addItem($spacer_2, 1, 0);

    $table_exampleLayout->addWidget(frame6, 0, 0);
    languageChange();
    my $resize = Qt::Size(586, 482);
    $resize = $resize->expandedTo(minimumSizeHint());
    resize( $resize );
    clearWState( &Qt::WState_Polished );

    Qt::Object::connect(One_Row, SIGNAL "clicked()", this, SLOT "tableOneRow()");
    Qt::Object::connect(Two_Rows, SIGNAL "clicked()", this, SLOT "tableTwoRows()");
}


#  Sets the strings of the subwidgets using the current
#  language.

sub languageChange
{
    setCaption(trUtf8("Table Test") );
    One_Row->setText( trUtf8("One Row") );
    Two_Rows->setText( trUtf8("Two Rows") );
}


sub tableOneRow
{
		my @lines = ();
		
    open (FILE,"table_example.one") or die;
    while (defined (my $line = <FILE>))
    {
        chomp($line);
        push (@lines,$line);
        
        table->setNumCols(1);
        table->horizontalHeader()->setStretchEnabled(1);
        table->horizontalHeader()->setClickEnabled(0,-1);
        table->horizontalHeader()->setLabel(0,"Eine Spalte",-1);
        table->setNumRows(scalar(@lines));
				table->setFocusPolicy( &Qt::Table::NoFocus() );
        
        my $row = 0;
        foreach my $element (@lines)
        {
            table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }
    }				
}

sub tableTwoRows
{
    my @col1 = ();
		my @col2 = ();

    open (FILE,"table_example.two") or die;
    while (defined (my $line = <FILE>))
    {
        chomp($line);
				my @parts = split/\s+/,$line;
        push (@col1,$parts[0]);
        push (@col2,$parts[1]);
        
        table->setNumCols(2);
        table->horizontalHeader()->setStretchEnabled(1);
        table->horizontalHeader()->setLabel(0,"Erste Spalte",-1);
        table->horizontalHeader()->setLabel(1,"Zweite Spalte",-1);
        table->horizontalHeader()->setClickEnabled(0,-1);
        table->setNumRows(scalar(@col2) > scalar(@col1) ? scalar(@col1) : scalar(@col2));
				table->setFocusPolicy( &Qt::Table::NoFocus() );
        
        my $row = 0;
        foreach my $element (@col1)
        {
            table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }

				$row = 0;
        foreach my $element (@col2)
        {
            table->setItem($row,1,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }				
    }				
}



1;



package main;

use Qt;
use table_example;

my $a = Qt::Application(\@ARGV);
my $w = table_example;
$a->setMainWidget($w);
$w->show;
exit $a->exec;
table_ok.pl (application/x-perl, 4.6 KB)
#!/usr/bin/perl -w

use strict;
use utf8;
#use Qt::debug qw(all);

package table_example;
use Qt;
use Qt::isa qw(Qt::Widget);
use Qt::slots
    tableOneRow => [],
    tableTwoRows => [];
use Qt::attributes qw(
    frame6
    One_Row
    table
    Two_Rows
);


sub NEW
{
    shift->SUPER::NEW(@_[0..2]);

    if ( name() eq "unnamed" )
    {
        setName("table_example" );
    }

    my $table_exampleLayout = Qt::GridLayout(this, 1, 1, 11, 6, '$table_exampleLayout');

    frame6 = Qt::Frame(this, "frame6");
    frame6->setFrameShape( &Qt::Frame::StyledPanel() );
    frame6->setFrameShadow( &Qt::Frame::Raised() );
    my $frame6Layout = Qt::GridLayout(frame6, 1, 1, 11, 6, '$frame6Layout');
    my $spacer = Qt::SpacerItem(190, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum);
    $frame6Layout->addItem($spacer, 1, 3);

    One_Row = Qt::PushButton(frame6, "One_Row");

    $frame6Layout->addWidget(One_Row, 1, 1);

    table = Qt::Table(frame6, "table");
    table->setNumRows( int(0) );
    table->setNumCols( int(0) );
    table->setReadOnly( 1 );
    table->setSelectionMode( &Qt::Table::NoSelection() );
    table->setLeftMargin(0);                               # don't show left vertical header

    $frame6Layout->addMultiCellWidget(table, 0, 0, 0, 3);

    Two_Rows = Qt::PushButton(frame6, "Two_Rows");

    $frame6Layout->addWidget(Two_Rows, 1, 2);
    my $spacer_2 = Qt::SpacerItem(190, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum);
    $frame6Layout->addItem($spacer_2, 1, 0);

    $table_exampleLayout->addWidget(frame6, 0, 0);
    languageChange();
    my $resize = Qt::Size(586, 482);
    $resize = $resize->expandedTo(minimumSizeHint());
    resize( $resize );
    clearWState( &Qt::WState_Polished );

    Qt::Object::connect(One_Row, SIGNAL "clicked()", this, SLOT "tableOneRow()");
    Qt::Object::connect(Two_Rows, SIGNAL "clicked()", this, SLOT "tableTwoRows()");
}


#  Sets the strings of the subwidgets using the current
#  language.

sub languageChange
{
    setCaption(trUtf8("Table Test") );
    One_Row->setText( trUtf8("One Row") );
    Two_Rows->setText( trUtf8("Two Rows") );
}


sub tableOneRow
{
		my @lines = ();
		
    open (FILE,"table_example.one") or die;
    while (defined (my $line = <FILE>))
    {
        chomp($line);
        push (@lines,$line);

####
# Work Around
####
				clearTable();
        
        table->setNumCols(1);
        table->horizontalHeader()->setStretchEnabled(1);
        table->horizontalHeader()->setClickEnabled(0,-1);
        table->horizontalHeader()->setLabel(0,"Eine Spalte",-1);
        table->setNumRows(scalar(@lines));
				table->setFocusPolicy( &Qt::Table::NoFocus() );
        
        my $row = 0;
        foreach my $element (@lines)
        {
            table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }
    }				
}

sub tableTwoRows
{
    my @col1 = ();
		my @col2 = ();

    open (FILE,"table_example.two") or die;
    while (defined (my $line = <FILE>))
    {
        chomp($line);
				my @parts = split/\s+/,$line;
        push (@col1,$parts[0]);
        push (@col2,$parts[1]);

####
# Work Around
####
				clearTable();
        
        table->setNumCols(2);
        table->horizontalHeader()->setStretchEnabled(1);
        table->horizontalHeader()->setLabel(0,"Erste Spalte",-1);
        table->horizontalHeader()->setLabel(1,"Zweite Spalte",-1);
        table->horizontalHeader()->setClickEnabled(0,-1);
        table->setNumRows(scalar(@col2) > scalar(@col1) ? scalar(@col1) : scalar(@col2));
				table->setFocusPolicy( &Qt::Table::NoFocus() );
        
        my $row = 0;
        foreach my $element (@col1)
        {
            table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }

				$row = 0;
        foreach my $element (@col2)
        {
            table->setItem($row,1,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }				
    }				
}


####
# Work Around
####

sub clearTable 
{
    if (table->numRows() > 0)
    {
        if (table->numCols() > 1)
        {
            for (my $elem = 0; $elem < table->numRows() ;$elem++ )
            {
                table->takeItem(table->item($elem,0));
                table->takeItem(table->item($elem,1));
            }
        }
        else
        {
            for (my $elem = 0; $elem < table->numRows() ;$elem++ )
            {
                table->takeItem(table->item($elem,0));
            }
        }                       
    }
}



1;



package main;

use Qt;
use table_example;

my $a = Qt::Application(\@ARGV);
my $w = table_example;
$a->setMainWidget($w);
$w->show;
exit $a->exec;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.