qtestkeyboard.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:8k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtTest module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QTESTKEYBOARD_H
  38. #define QTESTKEYBOARD_H
  39. #if 0
  40. // inform syncqt
  41. #pragma qt_no_master_include
  42. #endif
  43. #include <QtTest/qtestassert.h>
  44. #include <QtTest/qtest_global.h>
  45. #include <QtTest/qtestsystem.h>
  46. #include <QtTest/qtestspontaneevent.h>
  47. #include <QtCore/qpointer.h>
  48. #include <QtGui/qapplication.h>
  49. #include <QtGui/qevent.h>
  50. #include <QtGui/qwidget.h>
  51. QT_BEGIN_HEADER
  52. QT_BEGIN_NAMESPACE
  53. QT_MODULE(Test)
  54. namespace QTest
  55. {
  56.     enum KeyAction { Press, Release, Click };
  57.     static void simulateEvent(QWidget *widget, bool press, int code,
  58.                               Qt::KeyboardModifiers modifier, QString text, bool repeat, int delay=-1)
  59.     {
  60.         QTEST_ASSERT(widget);
  61.         extern int Q_TESTLIB_EXPORT defaultKeyDelay();
  62.         if (delay == -1 || delay < defaultKeyDelay())
  63.             delay = defaultKeyDelay();
  64.         if(delay > 0)
  65.             QTest::qWait(delay);
  66.         QKeyEvent a(press ? QEvent::KeyPress : QEvent::KeyRelease, code, modifier, text, repeat);
  67.         QSpontaneKeyEvent::setSpontaneous(&a);
  68.         if (!qApp->notify(widget, &a))
  69.             QTest::qWarn("Keyboard event not accepted by receiving widget");
  70.     }
  71.     static void sendKeyEvent(KeyAction action, QWidget *widget, Qt::Key code,
  72.                              QString text, Qt::KeyboardModifiers modifier, int delay=-1)
  73.     {
  74.         QTEST_ASSERT(qApp);
  75.         if (!widget)
  76.             widget = QWidget::keyboardGrabber();
  77.         if (!widget) {
  78.             if (QWidget *apw = QApplication::activePopupWidget())
  79.                 widget = apw->focusWidget() ? apw->focusWidget() : apw;
  80.             else
  81.                 widget = QApplication::focusWidget();
  82.         }
  83.         if (!widget)
  84.             widget = QApplication::activeWindow();
  85.         QTEST_ASSERT(widget);
  86.         if (action == Click) {
  87.             QPointer<QWidget> ptr(widget);
  88.             sendKeyEvent(Press, widget, code, text, modifier, delay);
  89.             if (!ptr) {
  90.                 // if we send key-events to embedded widgets, they might be destroyed
  91.                 // when the user presses Return
  92.                 return;
  93.             }
  94.             sendKeyEvent(Release, widget, code, text, modifier, delay);
  95.             return;
  96.         }
  97.         bool repeat = false;
  98.         if (action == Press) {
  99.             if (modifier & Qt::ShiftModifier)
  100.                 simulateEvent(widget, true, Qt::Key_Shift, 0, QString(), false, delay);
  101.             if (modifier & Qt::ControlModifier)
  102.                 simulateEvent(widget, true, Qt::Key_Control, modifier & Qt::ShiftModifier, QString(), false, delay);
  103.             if (modifier & Qt::AltModifier)
  104.                 simulateEvent(widget, true, Qt::Key_Alt,
  105.                               modifier & (Qt::ShiftModifier | Qt::ControlModifier), QString(), false, delay);
  106.             if (modifier & Qt::MetaModifier)
  107.                 simulateEvent(widget, true, Qt::Key_Meta, modifier & (Qt::ShiftModifier
  108.                                                                       | Qt::ControlModifier | Qt::AltModifier), QString(), false, delay);
  109.             simulateEvent(widget, true, code, modifier, text, repeat, delay);
  110.         } else if (action == Release) {
  111.             simulateEvent(widget, false, code, modifier, text, repeat, delay);
  112.             if (modifier & Qt::MetaModifier)
  113.                 simulateEvent(widget, false, Qt::Key_Meta, modifier, QString(), false, delay);
  114.             if (modifier & Qt::AltModifier)
  115.                 simulateEvent(widget, false, Qt::Key_Alt, modifier &
  116.                               (Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier), QString(), false, delay);
  117.             if (modifier & Qt::ControlModifier)
  118.                 simulateEvent(widget, false, Qt::Key_Control,
  119.                               modifier & (Qt::ShiftModifier | Qt::ControlModifier), QString(), false, delay);
  120.             if (modifier & Qt::ShiftModifier)
  121.                 simulateEvent(widget, false, Qt::Key_Shift, modifier & Qt::ShiftModifier, QString(), false, delay);
  122.         }
  123.     }
  124.     // Convenience function
  125.     static void sendKeyEvent(KeyAction action, QWidget *widget, Qt::Key code,
  126.                              char ascii, Qt::KeyboardModifiers modifier, int delay=-1)
  127.     {
  128.         QString text;
  129.         if (ascii)
  130.             text = QString(QChar::fromLatin1(ascii));
  131.         sendKeyEvent(action, widget, code, text, modifier, delay);
  132.     }
  133.     inline static void keyEvent(KeyAction action, QWidget *widget, char ascii,
  134.                                 Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  135.     { sendKeyEvent(action, widget, asciiToKey(ascii), ascii, modifier, delay); }
  136.     inline static void keyEvent(KeyAction action, QWidget *widget, Qt::Key key,
  137.                                 Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  138.     { sendKeyEvent(action, widget, key, keyToAscii(key), modifier, delay); }
  139.     inline static void keyClicks(QWidget *widget, const QString &sequence,
  140.                                  Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  141.     {
  142.         for (int i=0; i < sequence.length(); i++)
  143.             keyEvent(Click, widget, sequence.at(i).toLatin1(), modifier, delay);
  144.     }
  145.     inline static void keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  146.     { keyEvent(Press, widget, key, modifier, delay); }
  147.     inline static void keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  148.     { keyEvent(Release, widget, key, modifier, delay); }
  149.     inline static void keyClick(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  150.     { keyEvent(Click, widget, key, modifier, delay); }
  151.     inline static void keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  152.     { keyEvent(Press, widget, key, modifier, delay); }
  153.     inline static void keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  154.     { keyEvent(Release, widget, key, modifier, delay); }
  155.     inline static void keyClick(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
  156.     { keyEvent(Click, widget, key, modifier, delay); }
  157. }
  158. QT_END_NAMESPACE
  159. QT_END_HEADER
  160. #endif // QTESTKEYBOARD_H