您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页Qt:窗口事件传递顺序

Qt:窗口事件传递顺序

来源:测品娱乐

1. 事件传递顺序(测试)

  • 继承 QPushButton 自定义个按钮类 XPushButton
  • 在父窗口 MainWindow 中添加一个按钮控件 XPushButton * btn;
  • 分别在 MainWindow 和 XPushButton 重载 以下两个函数
	// 1. 如果不重载以下两个函数,则点击事件不会由子窗口传递给父窗口

	// 2. 重载以下两个窗口的情况下,具体的事件传递得看  event() 的返回值

	// 2.1 event() 返回默认值:QPushButton::event(ev); 也就是默认处理方式
	//     如果重载了 mousePressEvent() ,说明控件有自己的处理方法,则事件传递给 mousePressEvent
	//     如果没有重载 mousePressEvent() ,默认事件已处理,不继续传递

	// 2.2 event() 手动返回 true 也就是手动确认事件已处理,不论有没有重载 mousePressEvent,
	//     事件都不会往下传递,mousePressEvent() 不会执行

	// 2.3 event() 手动返回 false 也就是认为事件未处理,不论有没有重载 mousePressEvent,
	//     事件都会直接返回上一级的 event(), 即 MainWindow::event(QEvent *ev)

	// XPushButton
	bool XPushButton::event(QEvent * ev)
	{
	    if (ev->type() == QEvent::MouseButtonPress)
	    {
	        qDebug()<< "XPushButton event()";
	        return false;   // 标记 B行
	    }
	    return QPushButton::event(ev);
	}	
	void XPushButton::mousePressEvent(QMouseEvent *ev)
	{
	    if(ev->button() == Qt::LeftButton)
	    {
	        qDebug()<< "XPushButton mousePressEvent()";
	    }
	}
	// 2.4 事件 在 MainWindow::event(QEvent *ev) 中的传递流程与上述相同,也取决于 event 的返回值
	//     和 是否重载了 mousePressEvent
	// MainWindow 
	bool MainWindow::event(QEvent *ev)
	{
	    if (ev->type() == QEvent::MouseButtonPress)
	    {
	        qDebug()<< "MainWindow event()";
	        return false;  // 标记 A行
	    }
	    return QMainWindow::event(ev);
	}
	void MainWindow::mousePressEvent(QMouseEvent *ev)
	{
	    qDebug()<< "MainWindow mousePressEvent()";
	}

2. 添加事件过滤器

添加以下两个步骤后,子空间的事件首先经由 MainWindow::eventFilter() , 然后再按照 上述流程走一遍。

  • 1.对这个按钮安装事件;
	btn->installEventFilter(父窗口指针);
  • 2.重载父窗口事件过滤器事件:
bool MainWindow::eventFilter(QObject * target, QEvent * ev)
{
    if (ev->type() == QEvent::MouseButtonPress)
        qDebug()<< "Parent eventFilter: button pressed";

    return QWidget::eventFilter(target, ev);
}

3. 特殊事件处理函数的激发方法

  • 键盘时间激发
	// 1. 设置窗口属性
	setFocusPolicy(Qt::StrongFocus);
	
	// 2. 重载事件处理函数
	void keyPressEvent(QKeyEvent *event) override;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务