Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |

# Table Example

Another QTable example.

Header file:

    /****************************************************************************
    ** $Id: qt/statistics.h   3.3.7   edited Aug 31 2005 $
    **
    ** Copyright (C) 1992-2005 Trolltech AS.  All rights reserved.
    **
    ** This file is part of an example program for Qt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #ifndef STATISTICS_H
    #define STATISTICS_H

    #include <qtable.h>
    #include <qcombobox.h>

    class TableItem : public QTableItem
    {
    public:
        TableItem( QTable *t, EditType et, const QString &txt ) : QTableItem( t, et, txt ) {}
        void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected );
    };

    class ComboItem : public QTableItem
    {
    public:
        ComboItem( QTable *t, EditType et );
        QWidget *createEditor() const;
        void setContentFromEditor( QWidget *w );
        void setText( const QString &s );

    private:
        QComboBox *cb;

    };

    class Table : public QTable
    {
        Q_OBJECT

    public:
        Table();
        void sortColumn( int col, bool ascending, bool wholeRows );

    private slots:
        void recalcSum( int row, int col );

    private:
        void initTable();

    };

    #endif

Implementation:

    /****************************************************************************
    ** $Id: qt/statistics.cpp   3.3.7   edited Aug 31 2005 $
    **
    ** Copyright (C) 1992-2005 Trolltech AS.  All rights reserved.
    **
    ** This file is part of an example program for Qt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include "statistics.h"

    #include <qdir.h>
    #include <qstringlist.h>
    #include <qheader.h>
    #include <qcombobox.h>
    #include <stdlib.h>

    const char* dirs[] = {
        "kernel",
        "tools",
        "widgets",
        "dialogs",
        "xml",
        "table",
        "network",
        "opengl",
        "canvas",
        0
    };

    Table::Table()
        : QTable( 10, 100, 0, "table" )
    {
        setSorting( TRUE );
        horizontalHeader()->setLabel( 0, tr( "File" ) );
        horizontalHeader()->setLabel( 1, tr( "Size (bytes)" ) );
        horizontalHeader()->setLabel( 2, tr( "Use in Sum" ) );
        initTable();
        adjustColumn( 0 );

        // if the user edited something we might need to recalculate the sum
        connect( this, SIGNAL( valueChanged( int, int ) ),
                 this, SLOT( recalcSum( int, int ) ) );
    }

    void Table::initTable()
    {
        // read all the Qt source and header files into a list
        QStringList all;
        int i = 0;
        QString srcdir( "../../../src/" );
        while ( dirs[ i ] ) {
            QDir dir( srcdir + dirs[ i ] );
            QStringList lst = dir.entryList( "*.cpp; *.h" );
            for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
                if ( ( *it ).contains( "moc" ) )
                    continue;
                all << (QString( dirs[ i ] ) + "/" + *it);
            }
            ++i;
        }

        // set the number of rows we'll need for the table
        setNumRows( all.count() + 1 );
        i = 0;
        int sum = 0;

        // insert the data into the table
        for ( QStringList::Iterator it = all.begin(); it != all.end(); ++it ) {
            setText( i, 0, *it );
            QFile f( srcdir + *it );
            setText( i, 1, QString::number( (ulong)f.size() ) );
            ComboItem *ci = new ComboItem( this, QTableItem::WhenCurrent );
            setItem( i++, 2, ci );
            sum += f.size();
        }

        // last row should show the sum
        TableItem *i1 = new TableItem( this, QTableItem::Never, tr( "Sum" ) );
        setItem( i, 0, i1 );
        TableItem *i2 = new TableItem( this, QTableItem::Never, QString::number( sum ) );
        setItem( i, 1, i2 );
    }

    void Table::recalcSum( int, int col )
    {
        // only recalc if a value in the second or third column changed
        if ( col < 1 || col > 2 )
            return;

        // recalc sum
        int sum = 0;
        for ( int i = 0; i < numRows() - 1; ++i ) {
            if ( text( i, 2 ) == "No" )
                continue;
            sum += text( i, 1 ).toInt();
        }

        // insert calculated data
        TableItem *i1 = new TableItem( this, QTableItem::Never, tr( "Sum" ) );
        setItem( numRows() - 1, 0, i1 );
        TableItem *i2 = new TableItem( this, QTableItem::Never, QString::number( sum ) );
        setItem( numRows() - 1, 1, i2 );
    }

    void Table::sortColumn( int col, bool ascending, bool /*wholeRows*/ )
    {
        // sum row should not be sorted, so get rid of it for now
        clearCell( numRows() - 1, 0 );
        clearCell( numRows() - 1, 1 );
        // do sort
        QTable::sortColumn( col, ascending, TRUE );
        // re-insert sum row
        recalcSum( 0, 1 );
    }

    void TableItem::paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected )
    {
        QColorGroup g( cg );
        // last row is the sum row - we want to make it more visible by
        // using a red background
        if ( row() == table()->numRows() - 1 )
            g.setColor( QColorGroup::Base, red );
        QTableItem::paint( p, g, cr, selected );
    }

    ComboItem::ComboItem( QTable *t, EditType et )
        : QTableItem( t, et, "Yes" ), cb( 0 )
    {
        // we do not want this item to be replaced
        setReplaceable( FALSE );
    }

    QWidget *ComboItem::createEditor() const
    {
        // create an editor - a combobox in our case
        ( (ComboItem*)this )->cb = new QComboBox( table()->viewport() );
        QObject::connect( cb, SIGNAL( activated( int ) ), table(), SLOT( doValueChanged() ) );
        cb->insertItem( "Yes" );
        cb->insertItem( "No" );
        // and initialize it
        cb->setCurrentItem( text() == "No" ? 1 : 0 );
        return cb;
    }

    void ComboItem::setContentFromEditor( QWidget *w )
    {
        // the user changed the value of the combobox, so synchronize the
        // value of the item (its text), with the value of the combobox
        if ( w->inherits( "QComboBox" ) )
            setText( ( (QComboBox*)w )->currentText() );
        else
            QTableItem::setContentFromEditor( w );
    }

    void ComboItem::setText( const QString &s )
    {
        if ( cb ) {
            // initialize the combobox from the text
            if ( s == "No" )
                cb->setCurrentItem( 1 );
            else
                cb->setCurrentItem( 0 );
        }
        QTableItem::setText( s );
    }

Main:

    /****************************************************************************
    ** $Id: qt/main.cpp   3.3.7   edited Aug 31 2005 $
    **
    ** Copyright (C) 1992-2005 Trolltech AS.  All rights reserved.
    **
    ** This file is part of an example program for Qt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include "statistics.h"
    #include <qapplication.h>
    int main( int argc, char **argv )
    {
        QApplication a(argc,argv);

        Table t;
        a.setMainWidget( &t );
        t.show();
        return a.exec();
    }

See also Table Examples.