C++/Qt/QMouseEvent — различия между версиями

Материал из C\C++ эксперт
Перейти к: навигация, поиск
м (1 версия: Импорт контента...)
 
м (1 версия: Импорт контента...)
 
(нет различий)

Текущая версия на 13:25, 25 мая 2010

Check event type

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. include <QCheckBox>
  2. include <QMouseEvent>

class MyCheckBox : public QCheckBox { public:

   void mousePressEvent(QMouseEvent *event);

}; void MyCheckBox::mousePressEvent(QMouseEvent *event) {

   if (event->button() == Qt::LeftButton) {
       // handle left mouse button here
   } else {
       // pass on other buttons to base class
       QCheckBox::mousePressEvent(event);
   }

} class MyWidget : public QWidget { public:

   bool event(QEvent *event);

}; static const int MyCustomEventType = 1099; class MyCustomEvent : public QEvent { public:

   MyCustomEvent() : QEvent((QEvent::Type)MyCustomEventType) {}

}; bool MyWidget::event(QEvent *event) {

   if (event->type() == QEvent::KeyPress) {
    QKeyEvent *ke = static_cast<QKeyEvent *>(event);
    if (ke->key() == Qt::Key_Tab) {
       return true;
    }
   } else if (event->type() == MyCustomEventType) {
    MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);
      return true;
   }
   return QWidget::event(event);

} int main() { }


 </source>


Handle QMouseEvent

<source lang="cpp"> Foundations of Qt Development\Chapter06\eventlister\eventwidget.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QCloseEvent>
  2. include <QContextMenuEvent>
  3. include <QEvent>
  4. include <QFocusEvent>
  5. include <QHideEvent>
  6. include <QKeyEvent>
  7. include <QMouseEvent>
  8. include <QPaintEvent>
  9. include <QResizeEvent>
  10. include <QShowEvent>
  11. include <QWheelEvent>
  12. include "eventwidget.h"

EventWidget::EventWidget( QWidget *parent ) : QWidget( parent ) { } void EventWidget::closeEvent( QCloseEvent * event ) {

 emit gotEvent( tr("closeEvent") );

} void EventWidget::enterEvent( QEvent * event ) {

 emit gotEvent( tr("enterEvent") );

} void EventWidget::leaveEvent( QEvent * event ) {

 emit gotEvent( tr("leaveEvent") );

} void EventWidget::hideEvent( QHideEvent * event ) {

 emit gotEvent( tr("hideEvent") );

} void EventWidget::showEvent( QShowEvent * event ) {

 emit gotEvent( tr("showEvent") );

} void EventWidget::paintEvent( QPaintEvent * event ) {

 emit gotEvent( tr("paintEvent") );

} void EventWidget::contextMenuEvent( QContextMenuEvent * event ) {

 emit gotEvent( tr("contextMenuEvent( x:%1, y:%2, reason:%3 )")
   .arg(event->x())
   .arg(event->y())
   .arg(event->reason()==2?"Other":
        event->reason()==1?"Keyboard":
                           "Mouse") );

} void EventWidget::focusInEvent( QFocusEvent * event ) {

 emit gotEvent( tr("focusInEvent( reason:%1 )")
   .arg( event->reason()==0?"MouseFocusReason":
         event->reason()==1?"TabFocusReason":
         event->reason()==2?"BacktabFocusReason":
         event->reason()==3?"ActiveWindowFocusReason":
         event->reason()==4?"PopupFocusReason":
         event->reason()==5?"ShortcutFocusReason":
         event->reason()==6?"MenuBarFocusReason":
                            "OtherFocusReason" ) );

} void EventWidget::focusOutEvent( QFocusEvent * event ) {

 emit gotEvent( tr("focusOutEvent( reason:%1 )")
   .arg( event->reason()==0?"MouseFocusReason":
         event->reason()==1?"TabFocusReason":
         event->reason()==2?"BacktabFocusReason":
         event->reason()==3?"ActiveWindowFocusReason":
         event->reason()==4?"PopupFocusReason":
         event->reason()==5?"ShortcutFocusReason":
         event->reason()==6?"MenuBarFocusReason":
                            "OtherFocusReason" ) );

} void EventWidget::keyPressEvent( QKeyEvent * event ) {

 emit gotEvent( tr("keyPressEvent( text:%1, modifiers:%2 )")
   .arg( event->text() )
   .arg( event->modifiers()==0?tr("NoModifier"):(
        (event->modifiers()&Qt::ShiftModifier      ==0?tr(""):
           tr("ShiftModifier "))+
        (event->modifiers()&Qt::ControlModifier    ==0?tr(""):
           tr("ControlModifier "))+
        (event->modifiers()&Qt::AltModifier        ==0?tr(""):
           tr("AltModifier "))+
        (event->modifiers()&Qt::MetaModifier       ==0?tr(""):
           tr("MetaModifier "))+
        (event->modifiers()&Qt::KeypadModifier     ==0?tr(""):
           tr("KeypadModifier "))+
        (event->modifiers()&Qt::GroupSwitchModifier==0?tr(""):
           tr("GroupSwitchModifier")) ) ) );

} void EventWidget::keyReleaseEvent( QKeyEvent * event ) {

 emit gotEvent( tr("keyReleaseEvent( text:%1, modifiers:%2 )")
   .arg( event->text() )
   .arg( event->modifiers()==0?tr("NoModifier"):(
        (event->modifiers()&Qt::ShiftModifier      ==0?tr(""):
           tr("ShiftModifier "))+
        (event->modifiers()&Qt::ControlModifier    ==0?tr(""):
           tr("ControlModifier "))+
        (event->modifiers()&Qt::AltModifier        ==0?tr(""):
           tr("AltModifier "))+
        (event->modifiers()&Qt::MetaModifier       ==0?tr(""):
           tr("MetaModifier "))+
        (event->modifiers()&Qt::KeypadModifier     ==0?tr(""):
           tr("KeypadModifier "))+
        (event->modifiers()&Qt::GroupSwitchModifier==0?tr(""):
           tr("GroupSwitchModifier")) ) ) );

} void EventWidget::mouseDoubleClickEvent( QMouseEvent * event ) {

 emit gotEvent( tr("mouseDoubleClickEvent( x:%1, y:%2, button:%3 )")
   .arg( event->x() )
   .arg( event->y() )
   .arg( event->button()==Qt::LeftButton? "LeftButton":
         event->button()==Qt::RightButton?"RightButton":
         event->button()==Qt::MidButton?  "MidButton":
         event->button()==Qt::XButton1?   "XButton1":
                                          "XButton2" ) );

} void EventWidget::mouseMoveEvent( QMouseEvent * event ) {

 emit gotEvent( tr("mouseMoveEvent( x:%1, y:%2, button:%3 )")
   .arg( event->x() )
   .arg( event->y() )
   .arg( event->button()==Qt::LeftButton? "LeftButton":
         event->button()==Qt::RightButton?"RightButton":
         event->button()==Qt::MidButton?  "MidButton":
         event->button()==Qt::XButton1?   "XButton1":
                                          "XButton2" ) );

} void EventWidget::mousePressEvent( QMouseEvent * event ) {

 emit gotEvent( tr("mousePressEvent( x:%1, y:%2, button:%3 )")
   .arg( event->x() )
   .arg( event->y() )
   .arg( event->button()==Qt::LeftButton? "LeftButton":
         event->button()==Qt::RightButton?"RightButton":
         event->button()==Qt::MidButton?  "MidButton":
         event->button()==Qt::XButton1?   "XButton1":
                                          "XButton2" ) );

} void EventWidget::mouseReleaseEvent( QMouseEvent * event ) {

 emit gotEvent( tr("mouseReleaseEvent( x:%1, y:%2, button:%3 )")
   .arg( event->x() )
   .arg( event->y() )
   .arg( event->button()==Qt::LeftButton? "LeftButton":
         event->button()==Qt::RightButton?"RightButton":
         event->button()==Qt::MidButton?  "MidButton":
         event->button()==Qt::XButton1?   "XButton1":
                                          "XButton2" ) );

} void EventWidget::resizeEvent( QResizeEvent * event ) {

 emit gotEvent( tr("resizeEvent( w:%1, h:%2 )")
   .arg( event->size().width() )
   .arg( event->size().height() ) );

} void EventWidget::wheelEvent( QWheelEvent * event ) {

 emit gotEvent( tr("wheelEvent( x:%1, y:%2, delta:%3, orientation:%4 )")
   .arg( event->x() )
   .arg( event->y() )
   .arg( event->delta() ).arg( event->orientation()==1?
     "Horizontal":"Vertical" ) );

}

Foundations of Qt Development\Chapter06\eventlister\eventwidget.h /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. ifndef EVENTWIDGET_H
  2. define EVENTWIDGET_H
  3. include <QWidget>

class QCloseEvent; class QContextMenuEvent; class QEvent; class QFocusEvent; class QHideEvent; class QKeyEvent; class QMouseEvent; class QPaintEvent; class QResizeEvent; class QShowEvent; class QWheelEvent; class EventWidget : public QWidget {

 Q_OBJECT
 

public:

 EventWidget( QWidget *parent = 0 );

signals:

 void gotEvent( const QString );

protected:

 void closeEvent( QCloseEvent * event );
 void contextMenuEvent( QContextMenuEvent * event );
 void enterEvent( QEvent * event );
 void focusInEvent( QFocusEvent * event );
 void focusOutEvent( QFocusEvent * event );
 void hideEvent( QHideEvent * event );
 void keyPressEvent( QKeyEvent * event );
 void keyReleaseEvent( QKeyEvent * event );
 void leaveEvent( QEvent * event );
 void mouseDoubleClickEvent( QMouseEvent * event );
 void mouseMoveEvent( QMouseEvent * event );
 void mousePressEvent( QMouseEvent * event );
 void mouseReleaseEvent( QMouseEvent * event );
 void paintEvent( QPaintEvent * event );
 void resizeEvent( QResizeEvent * event );
 void showEvent( QShowEvent * event );
 void wheelEvent( QWheelEvent * event );

};

  1. endif // EVENTWIDGET_H

Foundations of Qt Development\Chapter06\eventlister\main.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QApplication>
  2. include <QTextEdit>
  3. include "eventwidget.h"

int main( int argc, char **argv ) {

 QApplication app( argc, argv );
 
 QTextEdit log;
 EventWidget widget;
 
 QObject::connect( &widget, SIGNAL(gotEvent(QString)), &log, SLOT(append(QString)) );
     
 log.show();
 widget.show();
 
 return app.exec();

}


 </source>


Is mouse left button clicked

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. include <QCheckBox>
  2. include <QMouseEvent>

class MyCheckBox : public QCheckBox { public:

   void mousePressEvent(QMouseEvent *event);

}; void MyCheckBox::mousePressEvent(QMouseEvent *event) {

   if (event->button() == Qt::LeftButton) {
       // handle left mouse button here
   } else {
       // pass on other buttons to base class
       QCheckBox::mousePressEvent(event);
   }

} class MyWidget : public QWidget { public:

   bool event(QEvent *event);

}; static const int MyCustomEventType = 1099; class MyCustomEvent : public QEvent { public:

   MyCustomEvent() : QEvent((QEvent::Type)MyCustomEventType) {}

}; bool MyWidget::event(QEvent *event) {

   if (event->type() == QEvent::KeyPress) {
    QKeyEvent *ke = static_cast<QKeyEvent *>(event);
    if (ke->key() == Qt::Key_Tab) {
       return true;
    }
   } else if (event->type() == MyCustomEventType) {
    MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);
      return true;
   }
   return QWidget::event(event);

} int main() { }


 </source>


Qt UI mouse test

<source lang="cpp">

Foundations of Qt Development\Chapter16\widgettest\main.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QtTest>
  2. include "spinboxtest.h"

QTEST_MAIN(SpinBoxTest)

Foundations of Qt Development\Chapter16\widgettest\spinboxtest.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QtTest>
  2. include <QSpinBox>
  3. include "spinboxtest.h"

void SpinBoxTest::testKeys() {

 QSpinBox spinBox;
 
 spinBox.setRange( 1, 10 );
 spinBox.setValue( 5 );
 
 QTest::keyClick( &spinBox, Qt::Key_Up );
 QCOMPARE( spinBox.value(), 6 );
 
 QTest::keyClick( &spinBox, Qt::Key_Down );
 QCOMPARE( spinBox.value(), 5 );
 
 spinBox.setValue( 10 );
 QTest::keyClick( &spinBox, Qt::Key_Up );
 QCOMPARE( spinBox.value(), 10 );
 
 spinBox.setValue( 1 );
 QTest::keyClick( &spinBox, Qt::Key_Down );
 QCOMPARE( spinBox.value(), 1 );  

} void SpinBoxTest::testClicks() {

 QSpinBox spinBox;
 
 spinBox.setRange( 1, 10 );
 spinBox.setValue( 5 );
 
 QSize size = spinBox.size();
 QPoint upButton = QPoint( size.width()-2, 2 );
 QPoint downButton = QPoint( size.width()-2, size.height()-2 );
 
 QTest::mouseClick( &spinBox, Qt::LeftButton, 0, upButton );
 QCOMPARE( spinBox.value(), 6 );
 
 QTest::mouseClick( &spinBox, Qt::LeftButton, 0, downButton );
 QCOMPARE( spinBox.value(), 5 );
 
 spinBox.setValue( 10 );
 QTest::mouseClick( &spinBox, Qt::LeftButton, 0, upButton );
 QCOMPARE( spinBox.value(), 10 );
 
 spinBox.setValue( 1 );
 QTest::mouseClick( &spinBox, Qt::LeftButton, 0, downButton );
 QCOMPARE( spinBox.value(), 1 );  

} void SpinBoxTest::testSetting() {

 QSpinBox spinBox;
 
 spinBox.setRange( 1, 10 );
 spinBox.setValue( 5 );
 QCOMPARE( spinBox.value(), 5 );
 
 spinBox.setValue( 0 );
 QCOMPARE( spinBox.value(), 1 );
 spinBox.setValue( 11 );
 QCOMPARE( spinBox.value(), 10 );

}

Foundations of Qt Development\Chapter16\widgettest\spinboxtest.h /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. ifndef SPINBOXTEST_H
  2. define SPINBOXTEST_H
  3. include <QObject>

class SpinBoxTest : public QObject {

 Q_OBJECT
 

private slots:

 void testKeys();
 void testClicks();
 void testSetting();

};

  1. endif // SPINBOXTEST_H


 </source>


Scribble area

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef SCRIBBLEAREA_H
  2. define SCRIBBLEAREA_H
  3. include <QColor>
  4. include <QImage>
  5. include <QPoint>
  6. include <QWidget>

class ScribbleArea : public QWidget {

   Q_OBJECT

public:

   ScribbleArea(QWidget *parent = 0);
   bool openImage(const QString &fileName);
   bool saveImage(const QString &fileName, const char *fileFormat);
   void setPenColor(const QColor &newColor);
   void setPenWidth(int newWidth);
   bool isModified() const { return modified; }
   QColor penColor() const { return myPenColor; }
   int penWidth() const { return myPenWidth; }

public slots:

   void clearImage();
   void print();

protected:

   void mousePressEvent(QMouseEvent *event);
   void mouseMoveEvent(QMouseEvent *event);
   void mouseReleaseEvent(QMouseEvent *event);
   void paintEvent(QPaintEvent *event);
   void resizeEvent(QResizeEvent *event);

private:

   void drawLineTo(const QPoint &endPoint);
   void resizeImage(QImage *image, const QSize &newSize);
   bool modified;
   bool scribbling;
   int myPenWidth;
   QColor myPenColor;
   QImage image;
   QPoint lastPoint;

};

  1. endif


  1. include <QtGui>
  2. include "scribblearea.h"

ScribbleArea::ScribbleArea(QWidget *parent)

   : QWidget(parent)

{

   setAttribute(Qt::WA_StaticContents);
   modified = false;
   scribbling = false;
   myPenWidth = 1;
   myPenColor = Qt::blue;

}

bool ScribbleArea::openImage(const QString &fileName)

{

   QImage loadedImage;
   if (!loadedImage.load(fileName))
       return false;
   QSize newSize = loadedImage.size().expandedTo(size());
   resizeImage(&loadedImage, newSize);
   image = loadedImage;
   modified = false;
   update();
   return true;

}

bool ScribbleArea::saveImage(const QString &fileName, const char *fileFormat)

{

   QImage visibleImage = image;
   resizeImage(&visibleImage, size());
   if (visibleImage.save(fileName, fileFormat)) {
       modified = false;
       return true;
   } else {
       return false;
   }

}

void ScribbleArea::setPenColor(const QColor &newColor)

{

   myPenColor = newColor;

}

void ScribbleArea::setPenWidth(int newWidth)

{

   myPenWidth = newWidth;

}

void ScribbleArea::clearImage()

{

   image.fill(qRgb(255, 255, 255));
   modified = true;
   update();

}

void ScribbleArea::mousePressEvent(QMouseEvent *event)

{

   if (event->button() == Qt::LeftButton) {
       lastPoint = event->pos();
       scribbling = true;
   }

} void ScribbleArea::mouseMoveEvent(QMouseEvent *event) {

   if ((event->buttons() & Qt::LeftButton) && scribbling)
       drawLineTo(event->pos());

} void ScribbleArea::mouseReleaseEvent(QMouseEvent *event) {

   if (event->button() == Qt::LeftButton && scribbling) {
       drawLineTo(event->pos());
       scribbling = false;
   }

}

void ScribbleArea::paintEvent(QPaintEvent * /* event */)

{

   QPainter painter(this);
   painter.drawImage(QPoint(0, 0), image);

}

void ScribbleArea::resizeEvent(QResizeEvent *event)

{

   if (width() > image.width() || height() > image.height()) {
       int newWidth = qMax(width() + 128, image.width());
       int newHeight = qMax(height() + 128, image.height());
       resizeImage(&image, QSize(newWidth, newHeight));
       update();
   }
   QWidget::resizeEvent(event);

}

void ScribbleArea::drawLineTo(const QPoint &endPoint)

{

   QPainter painter(&image);
   painter.setPen(QPen(myPenColor, myPenWidth, Qt::SolidLine, Qt::RoundCap,
                       Qt::RoundJoin));
   painter.drawLine(lastPoint, endPoint);
   modified = true;
   int rad = (myPenWidth / 2) + 2;
   update(QRect(lastPoint, endPoint).normalized()
                                    .adjusted(-rad, -rad, +rad, +rad));
   lastPoint = endPoint;

}

void ScribbleArea::resizeImage(QImage *image, const QSize &newSize)

{

   if (image->size() == newSize)
       return;
   QImage newImage(newSize, QImage::Format_RGB32);
   newImage.fill(qRgb(255, 255, 255));
   QPainter painter(&newImage);
   painter.drawImage(QPoint(0, 0), *image);
   *image = newImage;

}

void ScribbleArea::print() {

  1. ifndef QT_NO_PRINTER
   QPrinter printer(QPrinter::HighResolution);

   QPrintDialog *printDialog = new QPrintDialog(&printer, this);

   if (printDialog->exec() == QDialog::Accepted) {
       QPainter painter(&printer);
       QRect rect = painter.viewport();
       QSize size = image.size();
       size.scale(rect.size(), Qt::KeepAspectRatio);
       painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
       painter.setWindow(image.rect());
       painter.drawImage(0, 0, image);
   }
  1. endif // QT_NO_PRINTER

}


  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QList>
  4. include <QMainWindow>

class ScribbleArea;

class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow();

protected:

   void closeEvent(QCloseEvent *event);

private slots:

   void open();
   void save();
   void penColor();
   void penWidth();
   void about();

private:

   void createActions();
   void createMenus();
   bool maybeSave();
   bool saveFile(const QByteArray &fileFormat);
   ScribbleArea *scribbleArea;
   QMenu *saveAsMenu;
   QMenu *fileMenu;
   QMenu *optionMenu;
   QMenu *helpMenu;
   QAction *openAct;
   QList<QAction *> saveAsActs;
   QAction *exitAct;
   QAction *penColorAct;
   QAction *penWidthAct;
   QAction *printAct;
   QAction *clearScreenAct;
   QAction *aboutAct;
   QAction *aboutQtAct;

};

  1. endif


  1. include <QtGui>
  2. include "mainwindow.h"
  3. include "scribblearea.h"

MainWindow::MainWindow() {

   scribbleArea = new ScribbleArea;
   setCentralWidget(scribbleArea);
   createActions();
   createMenus();
   setWindowTitle(tr("Scribble"));
   resize(500, 500);

}

void MainWindow::closeEvent(QCloseEvent *event)

{

   if (maybeSave()) {
       event->accept();
   } else {
       event->ignore();
   }

}

void MainWindow::open()

{

   if (maybeSave()) {
       QString fileName = QFileDialog::getOpenFileName(this,
                                  tr("Open File"), QDir::currentPath());
       if (!fileName.isEmpty())
           scribbleArea->openImage(fileName);
   }

}

void MainWindow::save()

{

   QAction *action = qobject_cast<QAction *>(sender());
   QByteArray fileFormat = action->data().toByteArray();
   saveFile(fileFormat);

}

void MainWindow::penColor()

{

   QColor newColor = QColorDialog::getColor(scribbleArea->penColor());
   if (newColor.isValid())
       scribbleArea->setPenColor(newColor);

}

void MainWindow::penWidth()

{

   bool ok;
   int newWidth = QInputDialog::getInteger(this, tr("Scribble"),
                                           tr("Select pen width:"),
                                           scribbleArea->penWidth(),
                                           1, 50, 1, &ok);
   if (ok)
       scribbleArea->setPenWidth(newWidth);

}

void MainWindow::about()

{

   QMessageBox::about(this, tr("About Scribble"),
tr("

The Scribble example shows how to use QMainWindow as the " "base widget for an application, and how to reimplement some of " "QWidget"s event handlers to receive the events generated for " "the application"s widgets:

We reimplement the mouse event "

              "handlers to facilitate drawing, the paint event handler to "
              "update the application and the resize event handler to optimize "
              "the application"s appearance. In addition we reimplement the "
              "close event handler to intercept the close events before "
"terminating the application.

The example also demonstrates "

              "how to use QPainter to draw an image in real time, as well as "
"to repaint widgets.

"));

}

void MainWindow::createActions()

{

   openAct = new QAction(tr("&Open..."), this);
   openAct->setShortcut(tr("Ctrl+O"));
   connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
   foreach (QByteArray format, QImageWriter::supportedImageFormats()) {
       QString text = tr("%1...").arg(QString(format).toUpper());
       QAction *action = new QAction(text, this);
       action->setData(format);
       connect(action, SIGNAL(triggered()), this, SLOT(save()));
       saveAsActs.append(action);
   }
   printAct = new QAction(tr("&Print..."), this);
   connect(printAct, SIGNAL(triggered()), scribbleArea, SLOT(print()));
   exitAct = new QAction(tr("E&xit"), this);
   exitAct->setShortcut(tr("Ctrl+Q"));
   connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
   penColorAct = new QAction(tr("&Pen Color..."), this);
   connect(penColorAct, SIGNAL(triggered()), this, SLOT(penColor()));
   penWidthAct = new QAction(tr("Pen &Width..."), this);
   connect(penWidthAct, SIGNAL(triggered()), this, SLOT(penWidth()));
   clearScreenAct = new QAction(tr("&Clear Screen"), this);
   clearScreenAct->setShortcut(tr("Ctrl+L"));
   connect(clearScreenAct, SIGNAL(triggered()),
           scribbleArea, SLOT(clearImage()));
   aboutAct = new QAction(tr("&About"), this);
   connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
   aboutQtAct = new QAction(tr("About &Qt"), this);
   connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

}

void MainWindow::createMenus()

{

   saveAsMenu = new QMenu(tr("&Save As"), this);
   foreach (QAction *action, saveAsActs)
       saveAsMenu->addAction(action);
   fileMenu = new QMenu(tr("&File"), this);
   fileMenu->addAction(openAct);
   fileMenu->addMenu(saveAsMenu);
   fileMenu->addAction(printAct);
   fileMenu->addSeparator();
   fileMenu->addAction(exitAct);
   optionMenu = new QMenu(tr("&Options"), this);
   optionMenu->addAction(penColorAct);
   optionMenu->addAction(penWidthAct);
   optionMenu->addSeparator();
   optionMenu->addAction(clearScreenAct);
   helpMenu = new QMenu(tr("&Help"), this);
   helpMenu->addAction(aboutAct);
   helpMenu->addAction(aboutQtAct);
   menuBar()->addMenu(fileMenu);
   menuBar()->addMenu(optionMenu);
   menuBar()->addMenu(helpMenu);

}

bool MainWindow::maybeSave()

{

   if (scribbleArea->isModified()) {
      QMessageBox::StandardButton ret;
      ret = QMessageBox::warning(this, tr("Scribble"),
                         tr("The image has been modified.\n"
                            "Do you want to save your changes?"),
                         QMessageBox::Save | QMessageBox::Discard
       | QMessageBox::Cancel);
       if (ret == QMessageBox::Save) {
           return saveFile("png");
       } else if (ret == QMessageBox::Cancel) {
           return false;
       }
   }
   return true;

}

bool MainWindow::saveFile(const QByteArray &fileFormat)

{

   QString initialPath = QDir::currentPath() + "/untitled." + fileFormat;
   QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
                              initialPath,
                              tr("%1 Files (*.%2);;All Files (*)")
                              .arg(QString(fileFormat.toUpper()))
                              .arg(QString(fileFormat)));
   if (fileName.isEmpty()) {
       return false;
   } else {
       return scribbleArea->saveImage(fileName, fileFormat);
   }

}


  1. include <QApplication>
  2. include "mainwindow.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   MainWindow window;
   window.show();
   return app.exec();

}


 </source>