QT事件机制详解

窗体的创建过程

首先推荐一个网站(https://code.woboq.org/),可以直接看QT所有类的源码,想看什么直接在里面搜索就可以看到,非常好用且方便;比如想QWidget的源码,就在网站里搜索QWidget,然后选择qwidget.cpp,就可以看到QWidget的源码实现,下面所贴的源码都是在这个网站上copy来的。

1. 首先进入main方法后,经过层层调用,最终会调用 QWidgetPrivate::create_sys ()方法,中间的调用层次我已省略,有兴趣的可以自己去看看,在生成窗口的同时,系统会为这个窗口生成并维护一个消息队列

int main(int argc, char *argv[])
{
   
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
//...经过多层调用后会进入下面这个函数,中间的调用层次我已省略,有兴趣的可以自己去看看
void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyOldWindow)
{
   
	//...为了方便观察,我把一些代码删掉了,看下面的关键代码就行
    QString windowClassName = qt_reg_winclass(q); //qt_reg_winclass方法在下面贴出
    if (!window)                                // always initialize
        initializeWindow = true;
    if (popup)
        flags |= Qt::WindowStaysOnTopHint; // a popup stays on top
        
   //...删除了中间代码,这些代码主要是设置一些窗口的相关flags、style
    if (!topLevel && q->testAttribute(Qt::WA_NativeWindow) && q->testAttribute(Qt::WA_Mapped)) {
   
        Q_ASSERT(q->internalWinId());
        ShowWindow(q->internalWinId(), SW_SHOW); //到此就创建完了一个窗口
    }
}

2. 下面来看窗体注册函数qt_reg_winclass(QWidget *),这个函数的主要作用就是调用windows api,进行窗口的注册,让系统生成一个窗口;wc.lpfnWndProc = (WNDPROC)QtWndProc;这一行代码是重点,把QtWndProc注册到系统;QtWndProc是系统消息处理回调函数,系统处理完消息后会调用这个函数,这个函数里再对系统处理过的消息进行分类处理

const QString qt_reg_winclass(QWidget *w)
{
   
//...省略代码
#ifndef Q_WS_WINCE
    WNDCLASSEX wc;
    wc.cbSize       = sizeof(WNDCLASSEX);
#else
    WNDCLASS wc;
#endif
    wc.style        = style;
    wc.lpfnWndProc  = (WNDPROC)QtWndProc; //重点:把消息处理回调函数注册到系统
    wc.cbClsExtra   = 0;
    wc.cbWndExtra   = 0;
    wc.hInstance    = qWinAppInst();
    if (icon) {
   
        wc.hIcon = (HICON)LoadImage(qWinAppInst(), L"IDI_ICON1", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
#ifndef Q_WS_WINCE
        if (wc.hIcon) {
   
            int sw = GetSystemMetrics(SM_CXSMICON);
            int sh = GetSystemMetrics(SM_CYSMICON);
            wc.hIconSm = (HICON)LoadImage(qWinAppInst(), L"IDI_ICON1", IMAGE_ICON, sw, sh, 0);
        } else {
   
            wc.hIcon = (HICON)LoadImage(0, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
            wc.hIconSm = 0;
        }
#endif
    } else {
   
        wc.hIcon    = 0;
#ifndef Q_WS_WINCE
        wc.hIconSm  = 0;
#endif
    }
    wc.hCursor      = 0;
#ifndef Q_WS_WINCE
    HBRUSH brush = 0;
    if (w && 
  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Qt鼠标事件代码详解Qt是一个跨平台的应用程序开发框架,可以使用C++编写,并提供了丰富的图形界面和事件处理功能。鼠标事件Qt中常用的事件之一,用于处理与鼠标相关的操作。 在Qt中,鼠标事件可以分为三个主要的事件类别:鼠标按下事件、鼠标释放事件和鼠标移动事件。 鼠标按下事件(QMouseEvent::MouseButtonPress)是在鼠标按下按钮时触发的事件。可以通过重写QWidget或QGraphicsView的鼠标按下事件函数来处理。在该函数中,可以通过QMouseEvent对象获取鼠标的位置、按钮和修改键等信息,从而实现对鼠标按下事件的处理。 鼠标释放事件(QMouseEvent::MouseButtonRelease)是在鼠标释放按钮时触发的事件。与鼠标按下事件类似,可以通过重写相应的函数来处理,通过QMouseEvent对象获取相关信息。 鼠标移动事件(QMouseEvent::MouseMove)是在鼠标移动时触发的事件。可以通过重写QWidget或QGraphicsView的鼠标移动事件函数来处理。在该函数中,可以通过QMouseEvent对象获取鼠标的位置、按钮和修改键等信息,实现对鼠标移动事件的处理。 除了以上三类事件外,还有其他一些鼠标事件,如鼠标双击事件、鼠标进入事件、鼠标离开事件等。 处理鼠标事件有两种方式:重写QWidget或QGraphicsView的鼠标事件函数,或者使用事件过滤器来处理。使用事件过滤器可以在不修改源码的情况下,为特定的控件添加鼠标事件处理。 通过对鼠标事件的处理,可以实现各种鼠标交互功能,如点击按钮、拖拽操作、绘图等。在处理鼠标事件时,可以根据具体需求,提取并利用事件中的信息,实现相应的逻辑和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值