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

# Simple Addressbook

This examples shows how to write a very simple, but complete application using an addressbook as the example.

Header file of the mainwindow:

    /****************************************************************************
    ** $Id: qt/mainwindow.h   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #ifndef AB_MAINWINDOW_H
    #define AB_MAINWINDOW_H

    #include <ntqmainwindow.h>
    #include <ntqstring.h>

    class TQToolBar;
    class TQPopupMenu;
    class ABCentralWidget;

    class ABMainWindow: public TQMainWindow
    {
        TQ_OBJECT

    public:
        ABMainWindow();
        ~ABMainWindow();

    protected slots:
        void fileNew();
        void fileOpen();
        void fileSave();
        void fileSaveAs();
        void filePrint();
        void closeWindow();

    protected:
        void setupMenuBar();
        void setupFileTools();
        void setupStatusBar();
        void setupCentralWidget();

        TQToolBar *fileTools;
        TQString filename;
        ABCentralWidget *view;

    };

    #endif

Implementation of the mainwindow:

    /****************************************************************************
    ** $Id: qt/mainwindow.cpp   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include "mainwindow.h"
    #include "centralwidget.h"

    #include <ntqtoolbar.h>
    #include <ntqtoolbutton.h>
    #include <ntqpopupmenu.h>
    #include <ntqmenubar.h>
    #include <ntqstatusbar.h>
    #include <ntqapplication.h>
    #include <ntqfiledialog.h>

    ABMainWindow::ABMainWindow()
        : TQMainWindow( 0, "example addressbook application" ),
          filename( TQString::null )
    {
        setupMenuBar();
        setupFileTools();
        setupStatusBar();
        setupCentralWidget();
    }

    ABMainWindow::~ABMainWindow()
    {
    }

    void ABMainWindow::setupMenuBar()
    {
        TQPopupMenu *file = new TQPopupMenu( this );
        menuBar()->insertItem( "&File", file );

        file->insertItem( "New", this, SLOT( fileNew() ), CTRL + Key_N );
        file->insertItem( TQPixmap( "fileopen.xpm" ), "Open", this, SLOT( fileOpen() ), CTRL + Key_O );
        file->insertSeparator();
        file->insertItem( TQPixmap( "filesave.xpm" ), "Save", this, SLOT( fileSave() ), CTRL + Key_S );
        file->insertItem( "Save As...", this, SLOT( fileSaveAs() ) );
        file->insertSeparator();
        file->insertItem( TQPixmap( "fileprint.xpm" ), "Print...", this, SLOT( filePrint() ), CTRL + Key_P );
        file->insertSeparator();
        file->insertItem( "Close", this, SLOT( closeWindow() ), CTRL + Key_W );
        file->insertItem( "Quit", tqApp, SLOT( quit() ), CTRL + Key_Q );
    }

    void ABMainWindow::setupFileTools()
    {
        //fileTools = new TQToolBar( this, "file operations" );
    }

    void ABMainWindow::setupStatusBar()
    {
        //statusBar()->message( "Ready", 2000 );
    }

    void ABMainWindow::setupCentralWidget()
    {
        view = new ABCentralWidget( this );
        setCentralWidget( view );
    }

    void ABMainWindow::closeWindow()
    {
        close();
    }

    void ABMainWindow::fileNew()
    {
    }

    void ABMainWindow::fileOpen()
    {
        TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
        if ( !fn.isEmpty() ) {
            filename = fn;
            view->load( filename );
        }
    }

    void ABMainWindow::fileSave()
    {
        if ( filename.isEmpty() ) {
            fileSaveAs();
            return;
        }

        view->save( filename );
    }

    void ABMainWindow::fileSaveAs()
    {
        TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, this );
        if ( !fn.isEmpty() ) {
            filename = fn;
            fileSave();
        }
    }

    void ABMainWindow::filePrint()
    {
    }

Header file of the centralwidget:

    /****************************************************************************
    ** $Id: qt/centralwidget.h   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #ifndef AB_CENTRALWIDGET_H
    #define AB_CENTRALWIDGET_H

    #include <ntqwidget.h>
    #include <ntqstring.h>

    class TQTabWidget;
    class TQListView;
    class TQGridLayout;
    class TQLineEdit;
    class TQPushButton;
    class TQListViewItem;
    class TQCheckBox;

    class ABCentralWidget : public TQWidget
    {
        TQ_OBJECT

    public:
        ABCentralWidget( TQWidget *parent, const char *name = 0 );

        void save( const TQString &filename );
        void load( const TQString &filename );

    protected slots:
        void addEntry();
        void changeEntry();
        void itemSelected( TQListViewItem* );
        void selectionChanged();
        void toggleFirstName();
        void toggleLastName();
        void toggleAddress();
        void toggleEMail();
        void findEntries();

    protected:
        void setupTabWidget();
        void setupListView();

        TQGridLayout *mainGrid;
        TQTabWidget *tabWidget;
        TQListView *listView;
        TQPushButton *add, *change, *find;
        TQLineEdit *iFirstName, *iLastName, *iAddress, *iEMail,
            *sFirstName, *sLastName, *sAddress, *sEMail;
        TQCheckBox *cFirstName, *cLastName, *cAddress, *cEMail;

    };

    #endif

Implementation of the centralwidget:

    /****************************************************************************
    ** $Id: qt/centralwidget.cpp   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include "centralwidget.h"

    #include <ntqtabwidget.h>
    #include <ntqlistview.h>
    #include <ntqlayout.h>
    #include <ntqwidget.h>
    #include <ntqlabel.h>
    #include <ntqpushbutton.h>
    #include <ntqlineedit.h>
    #include <ntqlabel.h>
    #include <ntqcheckbox.h>
    #include <ntqfile.h>
    #include <ntqtextstream.h>

    ABCentralWidget::ABCentralWidget( TQWidget *parent, const char *name )
        : TQWidget( parent, name )
    {
        mainGrid = new TQGridLayout( this, 2, 1, 5, 5 );

        setupTabWidget();
        setupListView();

        mainGrid->setRowStretch( 0, 0 );
        mainGrid->setRowStretch( 1, 1 );
    }

    void ABCentralWidget::save( const TQString &filename )
    {
        if ( !listView->firstChild() )
            return;

        TQFile f( filename );
        if ( !f.open( IO_WriteOnly ) )
            return;

        TQTextStream t( &f );
        t.setEncoding(TQTextStream::UnicodeUTF8);

        TQListViewItemIterator it( listView );

        for ( ; it.current(); ++it )
            for ( unsigned int i = 0; i < 4; i++ )
                t << it.current()->text( i ) << "\n";

        f.close();
    }

    void ABCentralWidget::load( const TQString &filename )
    {
        listView->clear();

        TQFile f( filename );
        if ( !f.open( IO_ReadOnly ) )
            return;

        TQTextStream t( &f );
        t.setEncoding(TQTextStream::UnicodeUTF8);

        while ( !t.atEnd() ) {
            TQListViewItem *item = new TQListViewItem( listView );
            for ( unsigned int i = 0; i < 4; i++ )
                item->setText( i, t.readLine() );
        }

        f.close();
    }

    void ABCentralWidget::setupTabWidget()
    {
        tabWidget = new TQTabWidget( this );

        TQWidget *input = new TQWidget( tabWidget );
        TQGridLayout *grid1 = new TQGridLayout( input, 2, 5, 5, 5 );

        TQLabel *liFirstName = new TQLabel( "First &Name", input );
        liFirstName->resize( liFirstName->sizeHint() );
        grid1->addWidget( liFirstName, 0, 0 );

        TQLabel *liLastName = new TQLabel( "&Last Name", input );
        liLastName->resize( liLastName->sizeHint() );
        grid1->addWidget( liLastName, 0, 1 );

        TQLabel *liAddress = new TQLabel( "Add&ress", input );
        liAddress->resize( liAddress->sizeHint() );
        grid1->addWidget( liAddress, 0, 2 );

        TQLabel *liEMail = new TQLabel( "&E-Mail", input );
        liEMail->resize( liEMail->sizeHint() );
        grid1->addWidget( liEMail, 0, 3 );

        add = new TQPushButton( "A&dd", input );
        add->resize( add->sizeHint() );
        grid1->addWidget( add, 0, 4 );
        connect( add, SIGNAL( clicked() ), this, SLOT( addEntry() ) );

        iFirstName = new TQLineEdit( input );
        iFirstName->resize( iFirstName->sizeHint() );
        grid1->addWidget( iFirstName, 1, 0 );
        liFirstName->setBuddy( iFirstName );

        iLastName = new TQLineEdit( input );
        iLastName->resize( iLastName->sizeHint() );
        grid1->addWidget( iLastName, 1, 1 );
        liLastName->setBuddy( iLastName );

        iAddress = new TQLineEdit( input );
        iAddress->resize( iAddress->sizeHint() );
        grid1->addWidget( iAddress, 1, 2 );
        liAddress->setBuddy( iAddress );

        iEMail = new TQLineEdit( input );
        iEMail->resize( iEMail->sizeHint() );
        grid1->addWidget( iEMail, 1, 3 );
        liEMail->setBuddy( iEMail );

        change = new TQPushButton( "&Change", input );
        change->resize( change->sizeHint() );
        grid1->addWidget( change, 1, 4 );
        connect( change, SIGNAL( clicked() ), this, SLOT( changeEntry() ) );

        tabWidget->addTab( input, "&Add/Change Entry" );

        // --------------------------------------

        TQWidget *search = new TQWidget( this );
        TQGridLayout *grid2 = new TQGridLayout( search, 2, 5, 5, 5 );

        cFirstName = new TQCheckBox( "First &Name", search );
        cFirstName->resize( cFirstName->sizeHint() );
        grid2->addWidget( cFirstName, 0, 0 );
        connect( cFirstName, SIGNAL( clicked() ), this, SLOT( toggleFirstName() ) );

        cLastName = new TQCheckBox( "&Last Name", search );
        cLastName->resize( cLastName->sizeHint() );
        grid2->addWidget( cLastName, 0, 1 );
        connect( cLastName, SIGNAL( clicked() ), this, SLOT( toggleLastName() ) );

        cAddress = new TQCheckBox( "Add&ress", search );
        cAddress->resize( cAddress->sizeHint() );
        grid2->addWidget( cAddress, 0, 2 );
        connect( cAddress, SIGNAL( clicked() ), this, SLOT( toggleAddress() ) );

        cEMail = new TQCheckBox( "&E-Mail", search );
        cEMail->resize( cEMail->sizeHint() );
        grid2->addWidget( cEMail, 0, 3 );
        connect( cEMail, SIGNAL( clicked() ), this, SLOT( toggleEMail() ) );

        sFirstName = new TQLineEdit( search );
        sFirstName->resize( sFirstName->sizeHint() );
        grid2->addWidget( sFirstName, 1, 0 );

        sLastName = new TQLineEdit( search );
        sLastName->resize( sLastName->sizeHint() );
        grid2->addWidget( sLastName, 1, 1 );

        sAddress = new TQLineEdit( search );
        sAddress->resize( sAddress->sizeHint() );
        grid2->addWidget( sAddress, 1, 2 );

        sEMail = new TQLineEdit( search );
        sEMail->resize( sEMail->sizeHint() );
        grid2->addWidget( sEMail, 1, 3 );

        find = new TQPushButton( "F&ind", search );
        find->resize( find->sizeHint() );
        grid2->addWidget( find, 1, 4 );
        connect( find, SIGNAL( clicked() ), this, SLOT( findEntries() ) );

        cFirstName->setChecked( TRUE );
        sFirstName->setEnabled( TRUE );
        sLastName->setEnabled( FALSE );
        sAddress->setEnabled( FALSE );
        sEMail->setEnabled( FALSE );

        tabWidget->addTab( search, "&Search" );

        mainGrid->addWidget( tabWidget, 0, 0 );
    }

    void ABCentralWidget::setupListView()
    {
        listView = new TQListView( this );
        listView->addColumn( "First Name" );
        listView->addColumn( "Last Name" );
        listView->addColumn( "Address" );
        listView->addColumn( "E-Mail" );

        listView->setSelectionMode( TQListView::Single );

        connect( listView, SIGNAL( clicked( TQListViewItem* ) ), this, SLOT( itemSelected( TQListViewItem* ) ) );

        mainGrid->addWidget( listView, 1, 0 );
        listView->setAllColumnsShowFocus( TRUE );
    }

    void ABCentralWidget::addEntry()
    {
        if ( !iFirstName->text().isEmpty() || !iLastName->text().isEmpty() ||
             !iAddress->text().isEmpty() || !iEMail->text().isEmpty() ) {
            TQListViewItem *item = new TQListViewItem( listView );
            item->setText( 0, iFirstName->text() );
            item->setText( 1, iLastName->text() );
            item->setText( 2, iAddress->text() );
            item->setText( 3, iEMail->text() );
        }

        iFirstName->setText( "" );
        iLastName->setText( "" );
        iAddress->setText( "" );
        iEMail->setText( "" );
    }

    void ABCentralWidget::changeEntry()
    {
        TQListViewItem *item = listView->currentItem();

        if ( item &&
             ( !iFirstName->text().isEmpty() || !iLastName->text().isEmpty() ||
               !iAddress->text().isEmpty() || !iEMail->text().isEmpty() ) ) {
            item->setText( 0, iFirstName->text() );
            item->setText( 1, iLastName->text() );
            item->setText( 2, iAddress->text() );
            item->setText( 3, iEMail->text() );
        }
    }

    void ABCentralWidget::selectionChanged()
    {
        iFirstName->setText( "" );
        iLastName->setText( "" );
        iAddress->setText( "" );
        iEMail->setText( "" );
    }

    void ABCentralWidget::itemSelected( TQListViewItem *item )
    {
        if ( !item )
            return;
        item->setSelected( TRUE );
        item->repaint();

        iFirstName->setText( item->text( 0 ) );
        iLastName->setText( item->text( 1 ) );
        iAddress->setText( item->text( 2 ) );
        iEMail->setText( item->text( 3 ) );
    }

    void ABCentralWidget::toggleFirstName()
    {
        sFirstName->setText( "" );

        if ( cFirstName->isChecked() ) {
            sFirstName->setEnabled( TRUE );
            sFirstName->setFocus();
        }
        else
            sFirstName->setEnabled( FALSE );
    }

    void ABCentralWidget::toggleLastName()
    {
        sLastName->setText( "" );

        if ( cLastName->isChecked() ) {
            sLastName->setEnabled( TRUE );
            sLastName->setFocus();
        }
        else
            sLastName->setEnabled( FALSE );
    }

    void ABCentralWidget::toggleAddress()
    {
        sAddress->setText( "" );

        if ( cAddress->isChecked() ) {
            sAddress->setEnabled( TRUE );
            sAddress->setFocus();
        }
        else
            sAddress->setEnabled( FALSE );
    }

    void ABCentralWidget::toggleEMail()
    {
        sEMail->setText( "" );

        if ( cEMail->isChecked() ) {
            sEMail->setEnabled( TRUE );
            sEMail->setFocus();
        }
        else
            sEMail->setEnabled( FALSE );
    }

    void ABCentralWidget::findEntries()
    {
        if ( !cFirstName->isChecked() &&
             !cLastName->isChecked() &&
             !cAddress->isChecked() &&
             !cEMail->isChecked() ) {
            listView->clearSelection();
            return;
        }

        TQListViewItemIterator it( listView );

        for ( ; it.current(); ++it ) {
            bool select = TRUE;

            if ( cFirstName->isChecked() ) {
                if ( select && it.current()->text( 0 ).contains( sFirstName->text() ) )
                    select = TRUE;
                else
                    select = FALSE;
            }
            if ( cLastName->isChecked() ) {
                if ( select && it.current()->text( 1 ).contains( sLastName->text() ) )
                    select = TRUE;
                else
                    select = FALSE;
            }
            if ( cAddress->isChecked() ) {
                if ( select && it.current()->text( 2 ).contains( sAddress->text() ) )
                    select = TRUE;
                else
                    select = FALSE;
            }
            if ( cEMail->isChecked() ) {
                if ( select && it.current()->text( 3 ).contains( sEMail->text() ) )
                    select = TRUE;
                else
                    select = FALSE;
            }

            if ( select )
                it.current()->setSelected( TRUE );
            else
                it.current()->setSelected( FALSE );
            it.current()->repaint();
        }
    }

Main:

    /****************************************************************************
    ** $Id: qt/main.cpp   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include <ntqapplication.h>

    #include "mainwindow.h"

    int main( int argc, char ** argv )
    {
        TQApplication a( argc, argv );

        ABMainWindow *mw = new ABMainWindow();
        mw->setCaption( "TQt Example - Addressbook" );
        a.setMainWidget( mw );
        mw->show();

        a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
        int result = a.exec();
        delete mw;
        return result;
    }

See also Examples.