• 7061阅读
  • 3回复

Qt部件关闭按钮事件流程 [复制链接]

上一主题 下一主题
离线luna0304
 
只看楼主 倒序阅读 楼主  发表于: 2013-11-14
— 本帖被 XChinux 执行加亮操作(2013-11-19) —
当Qt对话框标题栏关闭按钮被点击时,QWidget::close()函数是如何被调用的?
离线dbzhang800

只看该作者 1楼 发表于: 2013-11-15
close() 和 点击关闭按钮时平行的,二者都会生成 QCloseEvent 事件,并传递给该QWidget::event(),该事件处理函数如果接受该事件,那么就销毁该Widget。(C++中销毁东西通过的是 delete)

点击按钮时,系统消息,比如Windows下的WM_CLOSE 被捕捉,转化成QCloseEvent放入QApplication的事件循环进行派发。
离线toby520

只看该作者 2楼 发表于: 2013-11-15
我是来看dbzhang的
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线luna0304
只看该作者 3楼 发表于: 2013-11-15
回 1楼(dbzhang800) 的帖子
十分感谢您的回复。close()与点击关闭按钮是平行的那就讲得通了。如下是我的理解不知是否正确。
//
// QtWndProc() receives all messages from the main event loop
//

该函数接收所有系统消息,当收到WM_CLOSE则调用QETWidget::translateCloseEvent(MSG)

extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
            case WM_CLOSE:                                // close window
            widget->translateCloseEvent(msg);
            RETURN(0);                                // always handled
}

QETWidget继承于QWidget,所以d_func()->close_helper()实际上就是调用QWidgetPrivate::close_helper()

bool QETWidget::translateCloseEvent(cst MSG &)
{
    return d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent);
}

该函数发出closeEvent事件
bool QWidgetPrivate::close_helper(CloseMode mode)
{
   ...
    if (mode != CloseNoEvent) {
        QCloseEvent e;
        if (mode == CloseWithSpontaneousEvent)
            QApplication::sendSpontaneousEvent(q, &e);
        else
            QApplication::sendEvent(q, &e);
        if (!that.isNull() && !e.isAccepted()) {
            data.is_closing = 0;
            return false;
        }
    }
    ...
}

QWidget::close()同理调用QWidgetPrivate::close_helper()

bool QWidget::close()
{
    return d_func()->close_helper(QWidgetPrivate::CloseWithEvent);
}
快速回复
限100 字节
 
上一个 下一个