| 1 | /****************************************************************************
|
|---|
| 2 | ** $Id: popup.cpp 2 2005-11-16 15:49:26Z dmik $
|
|---|
| 3 | **
|
|---|
| 4 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|---|
| 5 | **
|
|---|
| 6 | ** This file is part of an example program for Qt. This example
|
|---|
| 7 | ** program may be used, distributed and modified without limitation.
|
|---|
| 8 | **
|
|---|
| 9 | *****************************************************************************/
|
|---|
| 10 |
|
|---|
| 11 | #include "popup.h"
|
|---|
| 12 | #include <qapplication.h>
|
|---|
| 13 | #include <qlayout.h>
|
|---|
| 14 |
|
|---|
| 15 | FancyPopup::FancyPopup( QWidget* parent, const char* name ):
|
|---|
| 16 | QLabel( parent, name, WType_Popup ){
|
|---|
| 17 | setFrameStyle( WinPanel|Raised );
|
|---|
| 18 | setAlignment( AlignCenter );
|
|---|
| 19 | resize(150,100);
|
|---|
| 20 | moves = 0;
|
|---|
| 21 | setMouseTracking( TRUE );
|
|---|
| 22 | }
|
|---|
| 23 |
|
|---|
| 24 | void FancyPopup::mouseMoveEvent( QMouseEvent * e){
|
|---|
| 25 | moves++;
|
|---|
| 26 | QString s;
|
|---|
| 27 | s.sprintf("%d/%d", e->pos().x(), e->pos().y());
|
|---|
| 28 | if (e->state() & QMouseEvent::LeftButton)
|
|---|
| 29 | s += " (down)";
|
|---|
| 30 | setText(s);
|
|---|
| 31 | }
|
|---|
| 32 |
|
|---|
| 33 | void FancyPopup::mouseReleaseEvent( QMouseEvent * e){
|
|---|
| 34 | if (rect().contains( e->pos() ) || moves > 5)
|
|---|
| 35 | close();
|
|---|
| 36 | }
|
|---|
| 37 |
|
|---|
| 38 | void FancyPopup::closeEvent( QCloseEvent *e ){
|
|---|
| 39 | e->accept();
|
|---|
| 40 | moves = 0;
|
|---|
| 41 | if (!popupParent)
|
|---|
| 42 | return;
|
|---|
| 43 |
|
|---|
| 44 | // remember that we (as a popup) might recieve the mouse release
|
|---|
| 45 | // event instead of the popupParent. This is due to the fact that
|
|---|
| 46 | // the popupParent popped us up in its mousePressEvent handler. To
|
|---|
| 47 | // avoid the button remaining in pressed state we simply send a
|
|---|
| 48 | // faked mouse button release event to it.
|
|---|
| 49 | QMouseEvent me( QEvent::MouseButtonRelease, QPoint(0,0), QPoint(0,0), QMouseEvent::LeftButton, QMouseEvent::NoButton);
|
|---|
| 50 | QApplication::sendEvent( popupParent, &me );
|
|---|
| 51 | }
|
|---|
| 52 |
|
|---|
| 53 | void FancyPopup::popup( QWidget* parent) {
|
|---|
| 54 | popupParent = parent;
|
|---|
| 55 | setText("Move the mouse!");
|
|---|
| 56 | if (popupParent)
|
|---|
| 57 | move( popupParent->mapToGlobal( popupParent->rect().bottomLeft() ) );
|
|---|
| 58 | show();
|
|---|
| 59 | }
|
|---|
| 60 |
|
|---|
| 61 |
|
|---|
| 62 |
|
|---|
| 63 |
|
|---|
| 64 |
|
|---|
| 65 |
|
|---|
| 66 | Frame::Frame(QWidget* parent, const char* name): QFrame(parent, name){
|
|---|
| 67 | button1 = new QPushButton("Simple Popup", this);
|
|---|
| 68 | connect ( button1, SIGNAL( clicked() ), SLOT( button1Clicked() ) );
|
|---|
| 69 | button2 = new QPushButton("Fancy Popup", this);
|
|---|
| 70 | connect ( button2, SIGNAL( pressed() ), SLOT( button2Pressed() ) );
|
|---|
| 71 |
|
|---|
| 72 | QBoxLayout * l = new QHBoxLayout( this );
|
|---|
| 73 | button1->setMaximumSize(button1->sizeHint());
|
|---|
| 74 | button2->setMaximumSize(button2->sizeHint());
|
|---|
| 75 | l->addWidget( button1 );
|
|---|
| 76 | l->addWidget( button2 );
|
|---|
| 77 | l->activate();
|
|---|
| 78 |
|
|---|
| 79 | // button1->setGeometry(20,20,100,30);
|
|---|
| 80 | // button2->setGeometry(140,20,100,30);
|
|---|
| 81 | resize(270, 70);
|
|---|
| 82 |
|
|---|
| 83 | //create a very simple popup: it is just composed with other
|
|---|
| 84 | //widget and will be shown after clicking on button1
|
|---|
| 85 |
|
|---|
| 86 | popup1 = new QFrame( this ,0, WType_Popup);
|
|---|
| 87 | popup1->setFrameStyle( WinPanel|Raised );
|
|---|
| 88 | popup1->resize(150,100);
|
|---|
| 89 | QLineEdit *tmpE = new QLineEdit( popup1 );
|
|---|
| 90 | connect( tmpE, SIGNAL( returnPressed() ), popup1, SLOT( hide() ) );
|
|---|
| 91 | tmpE->setGeometry(10,10, 130, 30);
|
|---|
| 92 | tmpE->setFocus();
|
|---|
| 93 | QPushButton *tmpB = new QPushButton("Click me!", popup1);
|
|---|
| 94 | connect( tmpB, SIGNAL( clicked() ), popup1, SLOT( close() ) );
|
|---|
| 95 | tmpB->setGeometry(10, 50, 130, 30);
|
|---|
| 96 |
|
|---|
| 97 | // the fancier version uses its own class. It will be shown when
|
|---|
| 98 | // pressing button2, so they behavior is more like a modern menu
|
|---|
| 99 | // or toolbar.
|
|---|
| 100 |
|
|---|
| 101 | popup2 = new FancyPopup( this );
|
|---|
| 102 |
|
|---|
| 103 | // you might also add new widgets to the popup, just like you do
|
|---|
| 104 | // it with any other widget. The next four lines (if not
|
|---|
| 105 | // commented out) will for instance add a line edit widget.
|
|---|
| 106 |
|
|---|
| 107 | // tmpE = new QLineEdit( popup2 );
|
|---|
| 108 | // tmpE->setFocus();
|
|---|
| 109 | // connect( tmpE, SIGNAL( returnPressed() ), popup2, SLOT( close() ) );
|
|---|
| 110 | // tmpE->setGeometry(10, 10, 130, 30);
|
|---|
| 111 | }
|
|---|
| 112 |
|
|---|
| 113 |
|
|---|
| 114 | void Frame::button1Clicked(){
|
|---|
| 115 | popup1->move( mapToGlobal( button1->geometry().bottomLeft() ) );
|
|---|
| 116 | popup1->show();
|
|---|
| 117 | }
|
|---|
| 118 |
|
|---|
| 119 | void Frame::button2Pressed(){
|
|---|
| 120 | popup2->popup(button2);
|
|---|
| 121 | }
|
|---|
| 122 |
|
|---|
| 123 |
|
|---|
| 124 | int main( int argc, char **argv )
|
|---|
| 125 | {
|
|---|
| 126 | QApplication a(argc,argv);
|
|---|
| 127 |
|
|---|
| 128 | Frame frame;
|
|---|
| 129 | frame.setCaption("Qt Example - Custom Popups");
|
|---|
| 130 | a.setMainWidget(&frame);
|
|---|
| 131 | frame.show();
|
|---|
| 132 | return a.exec();
|
|---|
| 133 | }
|
|---|