Qt+Creator快速入门-----第六章(事件系统)学习总结
事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent,鼠标事件QMouseEvent和定时器事件QTimerEvent等,事件过滤器,自定义事件和随机事件的知识。
事件和信号是两个不同层面的东西,发出者不同,作用也不同。
5种处理一个事件的方法:
- 重新实现部件的paintEvent(),mousePressEvent()等事件处理函数。这是最常用的一种方法,不过只能用来处理特定部件的特定事件。
- 重新实现notify()函数。这个函数功能强大,提供了完全的控制,可以再事件过滤器得到事件之前就获得它们,但是它一次只能处理一个事件。
- 向QApplication对象上安装事件过滤器。可以同时处理多个事件
- 重新实现event函数。QObject类的event()函数可以在事件达到默认的事件处理函数之前获得该事件。
- 在对象上安装事件过滤器。
事件的传递:
每个程序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()组成的一种操作。