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

# Popup Widgets

This example shows how to implement widgets that should pop up.

Header file:

    /****************************************************************************
    ** $Id: qt/popup.h   3.3.8   edited Jan 11 14:46 $
    **
    ** Definition of something or other
    **
    ** Created : 979899
    **
    ** Copyright (C) 1997-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 POPUP_H
    #define POPUP_H
    #include <tqlabel.h>
    #include <tqpushbutton.h>
    #include <tqlineedit.h>

    class FancyPopup : public TQLabel
    {
        TQ_OBJECT
    public:
        FancyPopup( TQWidget* parent = 0, const char*  name=0);

        void popup( TQWidget* parent = 0);
    protected:
        virtual void mouseMoveEvent( TQMouseEvent * );
        virtual void mouseReleaseEvent( TQMouseEvent * );
        virtual void closeEvent( TQCloseEvent * );

    private:
        TQWidget* popupParent;
        int moves;
    };

     class Frame : public TQFrame
     {
         TQ_OBJECT
     public:
         Frame( TQWidget *parent=0, const char*  name=0);

     protected:

     private slots:
         void button1Clicked();
         void button2Pressed();

     private:
         TQPushButton *button1;
         TQPushButton *button2;

         TQFrame* popup1;
         FancyPopup* popup2;
     };

    #endif

Implementation:

    /****************************************************************************
    ** $Id: qt/popup.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 "popup.h"
    #include <tqapplication.h>
    #include <tqlayout.h>

    FancyPopup::FancyPopup( TQWidget* parent, const char*  name ):
        TQLabel( parent, name, WType_Popup ){
            setFrameStyle( WinPanel|Raised );
            setAlignment( AlignCenter );
            resize(150,100);
            moves = 0;
            setMouseTracking( true );
    }

    void FancyPopup::mouseMoveEvent( TQMouseEvent * e){
        moves++;
        TQString s;
        s.sprintf("%d/%d", e->pos().x(), e->pos().y());
        if (e->state() & TQMouseEvent::LeftButton)
            s += " (down)";
        setText(s);
    }

    void FancyPopup::mouseReleaseEvent( TQMouseEvent * e){
        if  (rect().contains( e->pos() ) || moves > 5)
            close();
    }

    void FancyPopup::closeEvent( TQCloseEvent *e ){
        e->accept();
        moves = 0;
        if (!popupParent)
            return;

        // remember that we (as a popup) might recieve the mouse release
        // event instead of the popupParent. This is due to the fact that
        // the popupParent popped us up in its mousePressEvent handler. To
        // avoid the button remaining in pressed state we simply send a
        // faked mouse button release event to it.
        TQMouseEvent me( TQEvent::MouseButtonRelease, TQPoint(0,0), TQPoint(0,0), TQMouseEvent::LeftButton, TQMouseEvent::NoButton);
        TQApplication::sendEvent( popupParent, &me );
    }

    void FancyPopup::popup( TQWidget* parent) {
        popupParent = parent;
        setText("Move the mouse!");
        if (popupParent)
            move( popupParent->mapToGlobal( popupParent->rect().bottomLeft() ) );
        show();
    }

    Frame::Frame(TQWidget* parent, const char* name): TQFrame(parent, name){
        button1 = new TQPushButton("Simple Popup", this);
        connect ( button1, TQ_SIGNAL( clicked() ), TQ_SLOT( button1Clicked() ) );
        button2 = new TQPushButton("Fancy Popup", this);
        connect ( button2, TQ_SIGNAL( pressed() ), TQ_SLOT( button2Pressed() ) );

        TQBoxLayout * l = new TQHBoxLayout( this );
        button1->setMaximumSize(button1->sizeHint());
        button2->setMaximumSize(button2->sizeHint());
        l->addWidget( button1 );
        l->addWidget( button2 );
        l->activate();

    //     button1->setGeometry(20,20,100,30);
    //     button2->setGeometry(140,20,100,30);
        resize(270, 70);

        //create a very simple popup: it is just composed with other
        //widget and will be shown after clicking on button1

        popup1 = new TQFrame( this ,0, WType_Popup);
        popup1->setFrameStyle( WinPanel|Raised );
        popup1->resize(150,100);
        TQLineEdit *tmpE = new TQLineEdit( popup1 );
        connect( tmpE, TQ_SIGNAL( returnPressed() ), popup1, TQ_SLOT( hide() ) );
        tmpE->setGeometry(10,10, 130, 30);
        tmpE->setFocus();
        TQPushButton *tmpB = new TQPushButton("Click me!", popup1);
        connect( tmpB, TQ_SIGNAL( clicked() ), popup1, TQ_SLOT( close() ) );
        tmpB->setGeometry(10, 50, 130, 30);

        // the fancier version uses its own class. It will be shown when
        // pressing button2, so they behavior is more like a modern menu
        // or toolbar.

        popup2 = new FancyPopup( this );

        // you might also add new widgets to the popup, just like you do
        // it with any other widget.  The next four lines (if not
        // commented out) will for instance add a line edit widget.

    //     tmpE = new TQLineEdit( popup2 );
    //     tmpE->setFocus();
    //     connect( tmpE, TQ_SIGNAL( returnPressed() ), popup2, TQ_SLOT( close() ) );
    //     tmpE->setGeometry(10, 10, 130, 30);
    }

    void Frame::button1Clicked(){
        popup1->move( mapToGlobal( button1->geometry().bottomLeft() ) );
        popup1->show();
    }

    void Frame::button2Pressed(){
        popup2->popup(button2);
    }

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

        Frame frame;
        frame.setCaption("TQt Example - Custom Popups");
        a.setMainWidget(&frame);
        frame.show();
        return a.exec();
    }

See also Examples.