C++/Qt/QMouseEvent
Содержание
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$
-
- /
- include <QCheckBox>
- 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. * */
- include <QCloseEvent>
- include <QContextMenuEvent>
- include <QEvent>
- include <QFocusEvent>
- include <QHideEvent>
- include <QKeyEvent>
- include <QMouseEvent>
- include <QPaintEvent>
- include <QResizeEvent>
- include <QShowEvent>
- include <QWheelEvent>
- 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. * */
- ifndef EVENTWIDGET_H
- define EVENTWIDGET_H
- 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 );
};
- 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. * */
- include <QApplication>
- include <QTextEdit>
- 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$
-
- /
- include <QCheckBox>
- 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. * */
- include <QtTest>
- 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. * */
- include <QtTest>
- include <QSpinBox>
- 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. * */
- ifndef SPINBOXTEST_H
- define SPINBOXTEST_H
- include <QObject>
class SpinBoxTest : public QObject {
Q_OBJECT
private slots:
void testKeys(); void testClicks(); void testSetting();
};
- 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$
-
- /
- ifndef SCRIBBLEAREA_H
- define SCRIBBLEAREA_H
- include <QColor>
- include <QImage>
- include <QPoint>
- 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;
};
- endif
- include <QtGui>
- 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() {
- 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); }
- endif // QT_NO_PRINTER
}
- ifndef MAINWINDOW_H
- define MAINWINDOW_H
- include <QList>
- 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;
};
- endif
- include <QtGui>
- include "mainwindow.h"
- 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); }
}
- include <QApplication>
- include "mainwindow.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv); MainWindow window; window.show(); return app.exec();
}
</source>