QT之QEvent机制

1.QEvent简介

       QEvent是QT的事件机制。QT的事件机制,肯定是借鉴了Windows的消息机制。Windows把所有的鼠标键盘以及内部事件都当作消息,并放进消息处理机制处理。QT本身,是把各个操作系统的API进行调用。Windows的消息机制,是一个非常简单有效的机制,QT作为借鉴,不为过。

      QEvent是QT的事件机制的基础;QEvent可以被QOject灵活运动,使事件得到接收和响应。

       Qt的主事件循环(QCoreApplication :: exec())从事件队列中获取本机窗口系统事件,将其转换为QEvents,然后将转换后的事件发送给QObject。

       通常,事件来自底层窗口系统(spontaneous()返回true),但是也可以使用QCoreApplication :: sendEvent()和QCoreApplication :: postEvent()手动发送事件(spontaneous()返回false)。

       QObject通過調用其QObject :: event()函數來接收事件。可以在子類中重新實現該函數,以自定義事件處理並添加其他事件類型。QWidget :: event()是一個著名的例子。默認情況下,事件被調度到事件處理程序,例如QObject :: timerEvent()和QWidget :: mouseMoveEvent()。QObject :: installEventFilter()允许一個對象攔截發往另一個對象的事件。

       基本的QEvent僅包含事件類型參數和“ accept”標誌。接受標誌設置為accept(),並使用ignore()清除。它是默認設置的,但是不要依賴它,因為子類可以選擇在其構造函數中清除它。

          QEvent的子類包含描述特定事件的其他參數。

2.QEvent分类

       QEvent的分类如下:

     

Constant

Value

Description

QEvent::None

0

Not an event.

QEvent::ActionAdded

114

A new action has been added (QActionEvent).

QEvent::ActionChanged

113

An action has been changed (QActionEvent).

QEvent::ActionRemoved

115

An action has been removed (QActionEvent).

QEvent::ActivationChange

99

A widget's top-level window activation state has changed.

QEvent::ApplicationActivate

121

This enum has been deprecated. Use ApplicationStateChange instead.

QEvent::ApplicationActivated

ApplicationActivate

This enum has been deprecated. Use ApplicationStateChange instead.

QEvent::ApplicationDeactivate

122

This enum has been deprecated. Use ApplicationStateChange instead.

QEvent::ApplicationFontChange

36

The default application font has changed.

QEvent::ApplicationLayoutDirectionChange

37

The default application layout direction has changed.

QEvent::ApplicationPaletteChange

38

The default application palette has changed.

QEvent::ApplicationStateChange

214

The state of the application has changed.

QEvent::ApplicationWindowIconChange

35

The application's icon has changed.

QEvent::ChildAdded

68

An object gets a child (QChildEvent).

QEvent::ChildPolished

69

A widget child gets polished (QChildEvent).

QEvent::ChildRemoved

71

An object loses a child (QChildEvent).

QEvent::Clipboard

40

The clipboard contents have changed.

QEvent::Close

19

Widget was closed (QCloseEvent).

QEvent::CloseSoftwareInputPanel

200

A widget wants to close the software input panel (SIP).

QEvent::ContentsRectChange

178

The margins of the widget's content rect changed.

QEvent::ContextMenu

82

Context popup menu (QContextMenuEvent).

QEvent::CursorChange

183

The widget's cursor has changed.

QEvent::DeferredDelete

52

The object will be deleted after it has cleaned up (QDeferredDeleteEvent)

QEvent::DragEnter

60

The cursor enters a widget during a drag and drop operation (QDragEnterEvent).

QEvent::DragLeave

62

The cursor leaves a widget during a drag and drop operation (QDragLeaveEvent).

QEvent::DragMove

61

A drag and drop operation is in progress (QDragMoveEvent).

QEvent::Drop

63

A drag and drop operation is completed (QDropEvent).

QEvent::DynamicPropertyChange

170

A dynamic property was added, changed, or removed from the object.

QEvent::EnabledChange

98

Widget's enabled state has changed.

QEvent::Enter

10

Mouse enters widget's boundaries (QEnterEvent).

QEvent::EnterEditFocus

150

An editor widget gains focus for editing. QT_KEYPAD_NAVIGATION must be defined.

QEvent::EnterWhatsThisMode

124

Send to toplevel widgets when the application enters "What's This?" mode.

QEvent::Expose

206

Sent to a window when its on-screen contents are invalidated and need to be flushed from the backing store.

QEvent::FileOpen

116

File open request (QFileOpenEvent).

QEvent::FocusIn

8

Widget or Window gains keyboard focus (QFocusEvent).

QEvent::FocusOut

9

Widget or Window loses keyboard focus (QFocusEvent).

QEvent::FocusAboutToChange

23

Widget or Window focus is about to change (QFocusEvent)

QEvent::FontChange

97

Widget's font has changed.

QEvent::Gesture

198

A gesture was triggered (QGestureEvent).

QEvent::GestureOverride

202

A gesture override was triggered (QGestureEvent).

QEvent::GrabKeyboard

188

Item gains keyboard grab (QGraphicsItem only).

QEvent::GrabMouse

186

Item gains mouse grab (QGraphicsItem only).

QEvent::GraphicsSceneContextMenu

159

Context popup menu over a graphics scene (QGraphicsSceneContextMenuEvent).

QEvent::GraphicsSceneDragEnter

164

The cursor enters a graphics scene during a drag and drop operation (QGraphicsSceneDragDropEvent).

QEvent::GraphicsSceneDragLeave

166

The cursor leaves a graphics scene during a drag and drop operation (QGraphicsSceneDragDropEvent).

QEvent::GraphicsSceneDragMove

165

A drag and drop operation is in progress over a scene (QGraphicsSceneDragDropEvent).

QEvent::GraphicsSceneDrop

167

A drag and drop operation is completed over a scene (QGraphicsSceneDragDropEvent).

QEvent::GraphicsSceneHelp

163

The user requests help for a graphics scene (QHelpEvent).

QEvent::GraphicsSceneHoverEnter

160

The mouse cursor enters a hover item in a graphics scene (QGraphicsSceneHoverEvent).

QEvent::GraphicsSceneHoverLeave

162

The mouse cursor leaves a hover item in a graphics scene (QGraphicsSceneHoverEvent).

QEvent::GraphicsSceneHoverMove

161

The mouse cursor moves inside a hover item in a graphics scene (QGraphicsSceneHoverEvent).

QEvent::GraphicsSceneMouseDoubleClick

158

Mouse press again (double click) in a graphics scene (QGraphicsSceneMouseEvent).

QEvent::GraphicsSceneMouseMove

155

Move mouse in a graphics scene (QGraphicsSceneMouseEvent).

QEvent::GraphicsSceneMousePress

156

Mouse press in a graphics scene (QGraphicsSceneMouseEvent).

QEvent::GraphicsSceneMouseRelease

157

Mouse release in a graphics scene (QGraphicsSceneMouseEvent).

QEvent::GraphicsSceneMove

182

Widget was moved (QGraphicsSceneMoveEvent).

QEvent::GraphicsSceneResize

181

Widget was resized (QGraphicsSceneResizeEvent).

QEvent::GraphicsSceneWheel

168

Mouse wheel rolled in a graphics scene (QGraphicsSceneWheelEvent).

QEvent::Hide

18

Widget was hidden (QHideEvent).

QEvent::HideToParent

27

A child widget has been hidden.

QEvent::HoverEnter

127

The mouse cursor enters a hover widget (QHoverEvent).

QEvent::HoverLeave

128

The mouse cursor leaves a hover widget (QHoverEvent).

QEvent::HoverMove

129

The mouse cursor moves inside a hover widget (QHoverEvent).

QEvent::IconDrag

96

The main icon of a window has been dragged away (QIconDragEvent).

QEvent::IconTextChange

101

Widget's icon text has been changed. (Deprecated)

QEvent::InputMethod

83

An input method is being used (QInputMethodEvent).

QEvent::InputMethodQuery

207

A input method query event (QInputMethodQueryEvent)

QEvent::KeyboardLayoutChange

169

The keyboard layout has changed.

QEvent::KeyPress

6

Key press (QKeyEvent).

QEvent::KeyRelease

7

Key release (QKeyEvent).

QEvent::LanguageChange

89

The application translation changed.

QEvent::LayoutDirectionChange

90

The direction of layouts changed.

QEvent::LayoutRequest

76

Widget layout needs to be redone.

QEvent::Leave

11

Mouse leaves widget's boundaries.

QEvent::LeaveEditFocus

151

An editor widget loses focus for editing. QT_KEYPAD_NAVIGATION must be defined.

QEvent::LeaveWhatsThisMode

125

Send to toplevel widgets when the application leaves "What's This?" mode.

QEvent::LocaleChange

88

The system locale has changed.

QEvent::NonClientAreaMouseButtonDblClick

176

A mouse double click occurred outside the client area (QMouseEvent).

QEvent::NonClientAreaMouseButtonPress

174

A mouse button press occurred outside the client area (QMouseEvent).

QEvent::NonClientAreaMouseButtonRelease

175

A mouse button release occurred outside the client area (QMouseEvent).

QEvent::NonClientAreaMouseMove

173

A mouse move occurred outside the client area (QMouseEvent).

QEvent::MacSizeChange

177

The user changed his widget sizes (macOS only).

QEvent::MetaCall

43

An asynchronous method invocation via QMetaObject::invokeMethod().

QEvent::ModifiedChange

102

Widgets modification state has been changed.

QEvent::MouseButtonDblClick

4

Mouse press again (QMouseEvent).

QEvent::MouseButtonPress

2

Mouse press (QMouseEvent).

QEvent::MouseButtonRelease

3

Mouse release (QMouseEvent).

QEvent::MouseMove

5

Mouse move (QMouseEvent).

QEvent::MouseTrackingChange

109

The mouse tracking state has changed.

QEvent::Move

13

Widget's position changed (QMoveEvent).

QEvent::NativeGesture

197

The system has detected a gesture (QNativeGestureEvent).

QEvent::OrientationChange

208

The screens orientation has changes (QScreenOrientationChangeEvent).

QEvent::Paint

12

Screen update necessary (QPaintEvent).

QEvent::PaletteChange

39

Palette of the widget changed.

QEvent::ParentAboutToChange

131

The widget parent is about to change.

QEvent::ParentChange

21

The widget parent has changed.

QEvent::PlatformPanel

212

A platform specific panel has been requested.

QEvent::PlatformSurface

217

A native platform surface has been created or is about to be destroyed (QPlatformSurfaceEvent).

QEvent::Polish

75

The widget is polished.

QEvent::PolishRequest

74

The widget should be polished.

QEvent::QueryWhatsThis

123

The widget should accept the event if it has "What's This?" help (QHelpEvent).

QEvent::ReadOnlyChange

106

Widget's read-only state has changed (since Qt 5.4).

QEvent::RequestSoftwareInputPanel

199

A widget wants to open a software input panel (SIP).

QEvent::Resize

14

Widget's size changed (QResizeEvent).

QEvent::ScrollPrepare

204

The object needs to fill in its geometry information (QScrollPrepareEvent).

QEvent::Scroll

205

The object needs to scroll to the supplied position (QScrollEvent).

QEvent::Shortcut

117

Key press in child for shortcut key handling (QShortcutEvent).

QEvent::ShortcutOverride

51

Key press in child, for overriding shortcut key handling (QKeyEvent). When a shortcut is about to trigger, ShortcutOverride is sent to the active window. This allows clients (e.g. widgets) to signal that they will handle the shortcut themselves, by accepting the event. If the shortcut override is accepted, the event is delivered as a normal key press to the focus widget. Otherwise, it triggers the shortcut action, if one exists.

QEvent::Show

17

Widget was shown on screen (QShowEvent).

QEvent::ShowToParent

26

A child widget has been shown.

QEvent::SockAct

50

Socket activated, used to implement QSocketNotifier.

QEvent::StateMachineSignal

192

A signal delivered to a state machine (QStateMachine::SignalEvent).

QEvent::StateMachineWrapped

193

The event is a wrapper for, i.e., contains, another event (QStateMachine::WrappedEvent).

QEvent::StatusTip

112

A status tip is requested (QStatusTipEvent).

QEvent::StyleChange

100

Widget's style has been changed.

QEvent::TabletMove

87

Wacom tablet move (QTabletEvent).

QEvent::TabletPress

92

Wacom tablet press (QTabletEvent).

QEvent::TabletRelease

93

Wacom tablet release (QTabletEvent).

QEvent::TabletEnterProximity

171

Wacom tablet enter proximity event (QTabletEvent), sent to QApplication.

QEvent::TabletLeaveProximity

172

Wacom tablet leave proximity event (QTabletEvent), sent to QApplication.

QEvent::TabletTrackingChange

219

The Wacom tablet tracking state has changed (since Qt 5.9).

QEvent::ThreadChange

22

The object is moved to another thread. This is the last event sent to this object in the previous thread. See QObject::moveToThread().

QEvent::Timer

1

Regular timer events (QTimerEvent).

QEvent::ToolBarChange

120

The toolbar button is toggled on macOS.

QEvent::ToolTip

110

A tooltip was requested (QHelpEvent).

QEvent::ToolTipChange

184

The widget's tooltip has changed.

QEvent::TouchBegin

194

Beginning of a sequence of touch-screen or track-pad events (QTouchEvent).

QEvent::TouchCancel

209

Cancellation of touch-event sequence (QTouchEvent).

QEvent::TouchEnd

196

End of touch-event sequence (QTouchEvent).

QEvent::TouchUpdate

195

Touch-screen event (QTouchEvent).

QEvent::UngrabKeyboard

189

Item loses keyboard grab (QGraphicsItem only).

QEvent::UngrabMouse

187

Item loses mouse grab (QGraphicsItemQQuickItem).

QEvent::UpdateLater

78

The widget should be queued to be repainted at a later time.

QEvent::UpdateRequest

77

The widget should be repainted.

QEvent::WhatsThis

111

The widget should reveal "What's This?" help (QHelpEvent).

QEvent::WhatsThisClicked

118

A link in a widget's "What's This?" help was clicked.

QEvent::Wheel

31

Mouse wheel rolled (QWheelEvent).

QEvent::WinEventAct

132

A Windows-specific activation event has occurred.

QEvent::WindowActivate

24

Window was activated.

QEvent::WindowBlocked

103

The window is blocked by a modal dialog.

QEvent::WindowDeactivate

25

Window was deactivated.

QEvent::WindowIconChange

34

The window's icon has changed.

QEvent::WindowStateChange

105

The window's state (minimized, maximized or full-screen) has changed (QWindowStateChangeEvent).

QEvent::WindowTitleChange

33

The window title has changed.

QEvent::WindowUnblocked

104

The window is unblocked after a modal dialog exited.

QEvent::WinIdChange

203

The window system identifer for this native widget has changed.

QEvent::ZOrderChange

126

The widget's z-order has changed. This event is never sent to top level windows.

3.QEvetnt使用和捕捉

     QObject的类(和继承类),可以使用QObject::event(), QObject::installEventFilter(),QCoreApplication::sendEvent(), QCoreApplication::postEvent(), 和 QCoreApplication::processEvents()等机制发送事件和和捕捉事件。

     上面2所属事件均可被使用和捕捉。

     提供样例如下:

     头文件:

   

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 


namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    virtual bool eventFilter(QObject *object, QEvent *event) override;

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

    源文件:

  

#include 

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    switch (event->type())
    {
    case QEvent::KeyPress:
        event->ignore();
        return true;

    default:
        qDebug() << event->type();
        break;
    }

    return QObject::eventFilter(object, event);
}

      可以打印出相关事件。

      发送事件源文件如下:

     

void MainWindow::on_pushButton_clicked()
{
    int key = Qt::Key_Delete;

     QKeyEvent EventPress(QEvent::KeyPress, key, Qt::NoModifier);
     QApplication::sendEvent(ui->textEdit, &EventPress);   //发送键盘按下事件

     QKeyEvent EventRelease(QEvent::KeyRelease, key, Qt::NoModifier);
     QApplication::sendEvent(ui->textEdit, &EventRelease); //发送键盘松开事件
}

   具体代码见GitHub:

   https://github.com/diziqian/QEvnetTest

你可能感兴趣的:(QT,C++)