Qt+Creator快速入门-----第六章(事件系统)学习总结

事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent,鼠标事件QMouseEvent和定时器事件QTimerEvent等,事件过滤器,自定义事件和随机事件的知识。

事件和信号是两个不同层面的东西,发出者不同,作用也不同。

5种处理一个事件的方法:

  1. 重新实现部件的paintEvent(),mousePressEvent()等事件处理函数。这是最常用的一种方法,不过只能用来处理特定部件的特定事件。
  2. 重新实现notify()函数。这个函数功能强大,提供了完全的控制,可以再事件过滤器得到事件之前就获得它们,但是它一次只能处理一个事件。
  3. 向QApplication对象上安装事件过滤器。可以同时处理多个事件
  4. 重新实现event函数。QObject类的event()函数可以在事件达到默认的事件处理函数之前获得该事件。
  5. 在对象上安装事件过滤器。

事件的传递:

每个程序main()函数的最后都会调用QApplication类的exec()函数,它会使Qt应用程序进入事件循环,这样就可以使应用程序在运行时接收发生的各种事件。一旦有事件发生,Qt便会构建一个相应的QEvent子类的对象来表示它,然后传递给相应的QObject对象或其子对象。

 1.事件先传递给指定窗口部件(获得焦点的窗口部件),如果该部件忽略掉事件,那么这个事件就会传递给这个部件的父部件。(第一种方法)

void MyLineEdit::keyPressEvent(QKeyEvent *event) // 键盘按下事件
{
    qDebug() << tr("MyLineEdit键盘按下事件");
    QLineEdit::keyPressEvent(event);          // 执行QLineEdit类的默认事件处理
    event->ignore();                          // 忽略该事件
}

 

2.先是事件过滤器,然后是焦点部件的event()函数,最后是焦点部件的事件处理函数;如果焦点部件忽略了该事件,那么会执行父部件的事件处理函数。

 

 

public:    
    bool event(QEvent *event);
bool mylineedit0::event(QEvent *event)
{
    if(event->type()==QEvent::KeyPress)
    {
        qDebug()<<tr(" mylineedit0 's event()");
    }
    return QLineEdit::event(event);//执行QLineEdit类event()函数的默认操作
}
 //Widget中
bool eventFilter(QObject *watched, QEvent *event);
 mylineedit->installEventFilter(this);//在widget上为mylineedit安装事件过滤器
//添加事件过滤器函数的定义
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==mylineedit)
    {
        //如果是mylineedit部件上的事件
        if(event->type()==QEvent::KeyPress)
        {
            qDebug()<<tr("widget eventfilter");
        }
        return QWidget::eventFilter(watched,event);
    }
}

鼠标事件和滚轮事件

QMouseEvent类可以获知鼠标是哪个键按下、鼠标指针的当前位置信息。QWheelEvent类用来表示鼠标滚轮事件,主要用来获取滚轮移动的方向和距离。

键盘事件

QKeyEvent类用来描述一个键盘事件。QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可以在帮助中通过Qt::Key关键字查看。回车键是Qt::Key_Return,键盘上的一些修饰键比如ctrl,shift等需要使用QKeyEvent的modifiers()函数获取。,可以在帮助中使用Qt::KeyboardModifier关键字查看。

void Widget::keyPressEvent(QKeyEvent *event)       // 键盘按下事件
{
    if(event->modifiers() == Qt::ControlModifier){ // 是否按下Ctrl键
        if(event->key() == Qt::Key_M)              // 是否按下M键
            setWindowState(Qt::WindowMaximized);   // 窗口最大化
    }
    else QWidget::keyPressEvent(event);
}

定时器事件

使用定时器一般都是使用QTimer类,以下一个简单的例子来介绍利用QTimer类实现电子表。

 在构造函数中

    QTimer *myTimer=new QTimer(this);
    //关联定时器的溢出信号到槽上
    connect(myTimer,&QTimer::timeout,this,&Widget::updateTimer);
    myTimer->start(1000);
private slots://建立私有的槽函数
    void updateTimer();

 添加定时器溢出信号槽函数的定义

void Widget::updateTimer()
{
    QTime time=QTime::currentTime();
    QString str=time.toString("mm:ss");
    if((time.second()%2)==0)
    {
        str[2]=' ';//每隔一秒将:显示为空格
    }
    ui->lcdNumber->display(str);
}

事件过滤器

通过事件过滤器实现在一个部件中监控其他多个部件的事件,它是由2个函数installEventFilter()和eventFilter()组成的一种操作。

posted @ 2022-02-06 15:53  HelloWorld庄先生  阅读(211)  评论(0编辑  收藏  举报