窗口函数注册
1 qt_internal_proc qeventdispatcher_win.cpp 138 0x7ffba1078f2b
10 qt_create_internal_window qeventdispatcher_win.cpp 335 0x7ffba107ca31
11 QEventDispatcherWin32::QEventDispatcherWin32 qeventdispatcher_win.cpp 460 0x7ffba107b72d
12 QEventDispatcherWin32::QEventDispatcherWin32 qeventdispatcher_win.cpp 452 0x7ffba107983c
13 QWindowsGuiEventDispatcher::QWindowsGuiEventDispatcher qwindowsguieventdispatcher.cpp 63 0x7ffb9ec31ffc
14 QWindowsIntegration::createEventDispatcher qwindowsintegration.cpp 637 0x7ffbcfc77b62
15 QGuiApplicationPrivate::createEventDispatcher qguiapplication.cpp 1508 0x7ffb9e5337b8
16 QApplicationPrivate::createEventDispatcher qapplication.cpp 169 0x7ffb9fa33b79
17 QCoreApplicationPrivate::init qcoreapplication.cpp 828 0x7ffba0c9ce35
18 QGuiApplicationPrivate::init qguiapplication.cpp 1534 0x7ffb9e531e25
19 QApplicationPrivate::init qapplication.cpp 496 0x7ffb9fa353c9
20 QApplication::QApplication qapplication.cpp 482 0x7ffb9fa2c070
... <更多>
1 qWindowsWndProc qwindowscontext.cpp 1688 0x7ffbcfc2a3f5
10 WindowCreationData::create qwindowswindow.cpp 809 0x7ffbcfd278bb
11 QWindowsWindowData::create qwindowswindow.cpp 1596 0x7ffbcfd0effb
12 QWindowsIntegration::createPlatformWindow qwindowsintegration.cpp 361 0x7ffbcfc76a88
13 QWindowPrivate::create qwindow.cpp 540 0x7ffb9e5fb72f
14 QWindow::create qwindow.cpp 664 0x7ffb9e5f3d6c
15 QWidgetPrivate::create qwidget.cpp 1314 0x7ffb9fb1e52b
16 QWidget::create qwidget.cpp 1180 0x7ffb9fb1b541
17 QWidgetPrivate::setVisible qwidget.cpp 8056 0x7ffb9fb2bafe
18 QWidget::setVisible qwidget.cpp 8035 0x7ffb9fb11b7d
19 QWidget::show qwidget.cpp 7661 0x7ffb9fb11ca0
20 main main.cpp 10 0x7ff6c0dc1717
... <更多>
主要就注册了 qt_internal_proc 和 qWindowsWndProc
1)LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp)
- 该函数是只处理自定义消息的, 套接字读写消息
WM_QT_SOCKETNOTIFIER,WM_QT_ACTIVATENOTIFIERS(对应套接字激活和失活状态),WM_QT_SENDPOSTEDEVENTS(异步消息),这三类消息都是qt自定义的,
- 对于第一个消息,主要处理的是套接字读写事件,将套接字事件转化为QEvent事件然后通过QCoreApplication::sendEvent(sn->obj, &event)立即处理;
- 第二类消息是指套接字注册成功或关闭时响应的消息,主要功能就是向函数WSAAsyncSelect(socket, internalHwnd, event ? int(WM_QT_SOCKETNOTIFIER) : 0, event)重新注册关注的事件;
- 第三个消息是最应用最广的消息,比如当我们调用异步函数发送消息时会触发该类消息QCoreApplication::postEvent(),该消息被触发后会从当前线程的自定义队列中取消息执行;
extern “C” LRESULT QT_WIN_CALLBACK qWindowsWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- 该函数处理用户操作产生的消息,比如鼠标等,它做了以下事情:
- 1)const QtWindows::WindowsEventType et = windowsEventType(message, wParam, lParam);将windows消息转为qt事件
- 2)const bool handled = QWindowsContext::instance()->windowsProc(hwnd, message, et, wParam, lParam, &result);在qt事件分类中处理该类消息。有的消息就直接处理,有的消息会postWindowSystemEvent(ev)到消息队列中windowSystemEventQueue;同时发出WM_QT_SENDPOSTEDEVENTS消息以经过window消息循环回调第1)个函数处理,达到异步效果。
消息分发
1 QEventDispatcherWin32::processEvents qeventdispatcher_win.cpp 492 0x7ffba10798b0
2 QWindowsGuiEventDispatcher::processEvents qwindowsguieventdispatcher.cpp 72 0x7ffb9ec32149
3 QEventLoop::processEvents qeventloop.cpp 140 0x7ffba0cbe6e0
4 QEventLoop::exec qeventloop.cpp 232 0x7ffba0cbe9b2
5 QCoreApplication::exec qcoreapplication.cpp 1348 0x7ffba0c997a5
6 QGuiApplication::exec qguiapplication.cpp 1875 0x7ffb9e5309d9
7 QApplication::exec qapplication.cpp 2616 0x7ffb9fa2ef7b
8 main main.cpp 10 0x7ff6c0dc171d
QEventDispatcherWin32::processEvents 从三个地方取消息
if (!(flags & QEventLoop::ExcludeUserInputEvents) && !d->queuedUserInputEvents.isEmpty()) {
// process queued user input events
msg = d->queuedUserInputEvents.takeFirst();
} else if (!(flags & QEventLoop::ExcludeSocketNotifiers) && !d->queuedSocketEvents.isEmpty()) {
// process queued socket events
msg = d->queuedSocketEvents.takeFirst();
} else if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
最后看下mousepress堆栈
1 MainWindow::mousePressEvent mainwindow.cpp 18 0x7ff6c0dc186e
2 QWidget::event qwidget.cpp 8637 0x7ffb9fb17dba
3 QMainWindow::event qmainwindow.cpp 1337 0x7ffb9fe42290
4 QApplicationPrivate::notify_helper qapplication.cpp 3401 0x7ffb9fa3536f
5 QApplication::notify qapplication.cpp 2868 0x7ffb9fa2fe17
6 QCoreApplication::notifyInternal2 qcoreapplication.cpp 1040 0x7ffba0c9bf45
7 QCoreApplication::sendSpontaneousEvent qcoreapplication.cpp 1448 0x7ffba0c9bde3
8 QApplicationPrivate::sendMouseEvent qapplication.cpp 2407 0x7ffb9fa3893f
9 QWidgetWindow::handleMouseEvent qwidgetwindow.cpp 680 0x7ffb9fb74c61
10 QWidgetWindow::event qwidgetwindow.cpp 296 0x7ffb9fb72a1b
11 QApplicationPrivate::notify_helper qapplication.cpp 3401 0x7ffb9fa3536f
12 QApplication::notify qapplication.cpp 2763 0x7ffb9fa2f4bb
13 QCoreApplication::notifyInternal2 qcoreapplication.cpp 1040 0x7ffba0c9bf45
14 QCoreApplication::sendSpontaneousEvent qcoreapplication.cpp 1448 0x7ffba0c9bde3
15 QGuiApplicationPrivate::processMouseEvent qguiapplication.cpp 2265 0x7ffb9e536ba9
16 QGuiApplicationPrivate::processWindowSystemEvent qguiapplication.cpp 2016 0x7ffb9e53a08e
17 QWindowSystemInterface::sendWindowSystemEvents qwindowsysteminterface.cpp 1175 0x7ffb9e6074b9
18 QWindowsGuiEventDispatcher::sendPostedEvents qwindowsguieventdispatcher.cpp 81 0x7ffb9ec321b6
19 QEventDispatcherWin32::processEvents qeventdispatcher_win.cpp 502 0x7ffba107994b
20 QWindowsGuiEventDispatcher::processEvents qwindowsguieventdispatcher.cpp 72 0x7ffb9ec32149
... <更多>