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 <ntqlabel.h>
#include <ntqpushbutton.h>
#include <ntqlineedit.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 <ntqapplication.h>
#include <ntqlayout.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, SIGNAL( clicked() ), SLOT( button1Clicked() ) );
    button2 = new TQPushButton("Fancy Popup", this);
    connect ( button2, SIGNAL( pressed() ), 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, SIGNAL( returnPressed() ), popup1, SLOT( hide() ) );
    tmpE->setGeometry(10,10, 130, 30);
    tmpE->setFocus();
    TQPushButton *tmpB = new TQPushButton("Click me!", popup1);
    connect( tmpB, SIGNAL( clicked() ), popup1, 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, SIGNAL( returnPressed() ), popup2, 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.


Copyright © 2007 TrolltechTrademarks
TQt 3.3.8