Qt Creator 模块学习 —— 事件系统(上)

Qt Creator 模块学习 —— 事件系统

1.Qt中的事件

大家提起QT其实最想起来的是信号和槽,并且觉得事件不就是信号和槽吗?两者不会冲突吗?事实上两者是不会冲突的,事件与信号也并不相同,比如单机一下界面上的按钮,按钮发射的是信号,可是按钮被按下就是一个事件,该事件并不是由按钮产生的,发出者与作用不同。因此事件与信号不是一个层次。

2.事件的处理

Qt中用一个个对象来表示一个个事件,继承自QEvent类。在Qt中任何一个QObject子类实例都可以接受和处理事件。并且每一个事件往往包含许多类型,比如对于鼠标而言,按下释放移动…
因此QEvent::type,但是这一切仅仅是为了表示事件那么如何处理事件呢?
帮助文档给了五种方式:
1.重新实现部件的paintEvent(),mousePressEvent()等事件处理函数,不过只能处理特定部件。
2.重新实现notify()函数,这个函数功能强大可以提供完全控制并且在事件过滤器之前就可以得到他们,但是一次仅可处理一种事件。
3.QApplication对象上安装事件过滤器,功能上与notify相同但是胜在可以处理多个事件。
4.重新实现event函数,该函数可以在事件到达默认的事件处理函数前获得该事件。
5.在对象上安装事件过滤器。可以在一个界面类处理多个事件

3.鼠标事件

事实上这些事件我自己学习的并不精通,本着总结知识点为目的,我仅仅对鼠标事件,滚轮事件,键盘进行总结并写下代码。
建立QWidget文件,并在ui设计界面加入label并铺满,随后新建class文件并改为QLabel类并加入以下代码(以下代码中的函数应为protected类),并将ui控件label提升为新建class类并部署全局。

void mylabel::mousePressEvent(QMouseEvent *ev){
    
    
    QString text = QString("<center><h1>Mouse Press:(%1, %2)</h1></center>")
            .arg(ev->x()).arg(ev->y());
    this->setText(text);
}


void mylabel::mouseReleaseEvent(QMouseEvent *ev){
    
    
    QString text = QString("<center><h1>Mouse Release:(%1, %2)</h1></center>")
            .arg(ev->x()).arg(ev->y());
    this->setText(text);
}


void mylabel::mouseMoveEvent(QMouseEvent *ev){
    
    
    QString text = QString("<center><h1>Mouse move:(%1, %2)</h1></center>")
            .arg(ev->x()).arg(ev->y());
    this->setText(text);
}
void mylabel::enterEvent(){
    
    
    QString text = QString("<center><h1>Mouse enter</h1></center>");
    this->setText(text);
}


void mylabel::leaveEvent(){
    
    
    QString text = QString("<center><h1>Mouse leave</h1></center>");
    this->setText(text);
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_50210478/article/details/108315372
今日推荐