Qt 之 消息机制(windows平台下)

窗口函数注册

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)

  1. 该函数是只处理自定义消息的, 套接字读写消息
    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 
... <更多>       
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值