Day02_Qt消息机制与事件 (下)

眉间皱痕 提交于 2020-01-25 00:42:08

 

在之前的程序中已经使用过事件,例如在Qt程序的main()函数中创建一个应用对象QApplication,然后调用它的exec()函数,该exec()函数就是开始Qt的事件循环,在执行exec()函数之后,程序就会进入事件循环来监听应用程序的事件。当事件发生时,Qt将创建一个事件对象,Qt中所有事件都继承于QEvent,在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是根据事件对象的类型分派给特定的事件处理函数(Event handler)。

 

事件处理函数为protected类型,为虚函数,举例:

新建工程,基类为widget,在ui界面中添加label标签:

之后在工程界面添加类文件,由于是添加Label的槽函数,而文件基类中没有Label基类,所以新建的文件基类选为QWidget,之后在生成的mylabel.h与myabel.cpp文件中将基类改为QLabel,.h与.cpp文件如图所示:

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = 0);
protected:
    //鼠标按下事件
    void mousePressEvent(QMouseEvent *ev);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *ev);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *ev);

     //鼠标进入窗口区域事件
    void enterEvent(QEvent *);
     //鼠标离开窗口区域事件
    void leaveEvent(QEvent *);

signals:

public slots:
};

#endif // MYLABEL_H

mylabel.cpp文件为:

#include "mylabel.h"
#include<QMouseEvent>
#include<QDebug>


MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{

}
//鼠标按下
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    int i=ev->x();
    int j=ev->y();
    //打印
    if(ev->button() == Qt::LeftButton)
    {
        qDebug() << "left";
    }
    else if(ev->button() == Qt::RightButton)
    {
        qDebug() << "right";
    }
    else if(ev->button() == Qt::MidButton)
    {
        qDebug() << "mid";
    }

    QString text=QString("<center><h1>Mouse Press:(%1,%2)</h1></center>").arg(i).arg(j);

    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><h2>Mouse move: (%1, %2)</h2></center>")
            .arg( ev->x() ).arg( ev->y() );

     this->setText(text);
}


void MyLabel::enterEvent(QEvent *ev)
{
    QString text = QString("<center><h1>Mouse enter</h1></center>");

    this->setText(text);
}

void MyLabel::leaveEvent(QEvent *ev)
{
    QString text = QString("<center><h1>Mouse leave</h1></center>");

    this->setText(text);
}

为了使得鼠标在初始时即被跟踪,可以在mylabel.cpp的主函数main函数中添加:

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    //设置追踪鼠标
     this->setMouseTracking(true);
}

之后在ui界面中选择label,将其进行提升,即可看到鼠标在移动、按下....的变化。

 

 

 

 

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    //按键按下事件
    void keyPressEvent(QKeyEvent *event); 
    //鼠标点击事件
    void mousePressEvent(QMouseEvent *); 


private:
    Ui::Widget *ui; 
};

#endif // WIDGET_H

在文件中新加protect类型的函数,虚函数的名字和参数由系统规定。之后在.cpp文件中定义函数

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!