一。事件
1.注意:
(1)在事件名称上用F1没有效果,需要在QWidget上用
(2)
2.新建事件:
(1)新建一个QWidget文件,命名为mylabel
(2)将头文件的class mylabel :publi QWidget改为class mylabel :publi QLabel(因为所用到的控件label是继承于QLabel的)
(3)将cpp文件中的QWidget(parent)改为QLabel(parent)
(4)在头文件中新建protected声明,并在protected下声明事件。
(5)在cpp文件中编写事件函数
3.鼠标移动事件(mouseMoveEvent)
(1)默认情况需要先按一下才开始触发移动事件
(2)若要一进入程序就触发事件,要在cpp文件的主函数下添加:
this->setMouseTracking(true);
static int x = 0; // 声明并初始化(此时为初始化赋值,如果这条语句出现在函数中,即便被多次调用,也只会执行一次。)
4.定时器事件(timerEvent)
(1)在头文件中声明定时器事件,声明一个定时器IDtimeID
(2)在cpp文件主函数启动(每秒):timeID=this->startTimer(1000);
(3)编写定时器函数
(4)停止定时器:this->killTimer(this->timeID);
5.键盘按下事件(KeyPressEvent):
(1)event->key() == Qt::Key_A表示键盘“A”键被按下。(event是函数所用的指针参数)
(2)键盘每个键名字可用F1查看
6.其他事件:
(1)鼠标点击事件:mousePressEvent
(2)鼠标释放事件:mouseReleaseEvent
(3)进入窗口事件:enterEvent
(4)离开窗口事件:leaveEvent
二。事件的接收和忽略
- 事件的接收:子类接收完事件后,事件就不会被父类接收:(如下,程序只会打印出“leftbutton was clicked”,而没有“was clicked”)
(注意:因为信号和槽只处理左键点击按钮,不处理右键点击信息,所以此程序右键点击按钮也不会出现“was clicked”,而不是说明事件没有传递到父类。)
(选中部分语句作用是使事件传到父类)
- 事件的忽略:(如上,将选中部分语句注释取消发挥作用之后,程序能够打印“leftbutton was clicked”和“was clicked”)
- e->ignore()命令:可以使得事件被忽略,但事件不是传递给父类,而是传递给了父组件。
- e->accept()命令:(Qt5默认)接收事件,事件不会传递下去。
三。event()函数的改写
- 事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。
如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。例如,我们希望在一个QWidget组件中监听 tab 键的按下,那么就可以继承QWidget,并重写它的event()函数,来达到这个目的。 - 例如让定时器关闭:
(1)在头文件中声明事件函数:(仅选中部分)
(2)在cpp文件中重写event函数
(其中如果传入的事件已被识别并且处理,则需要返回 true,否则返回 false。如果返回值是 true,那么 Qt 会认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。)
(return QWideget::event(event)命令可以使得除了定时器的其他事件可以正常运作)
四。事件过滤器(this的作用是?)
事件过滤器作用和位置:
1.在头文件中声明事件过滤器:
2.在cpp文件中安装事件过滤器(过滤哪个控件)
3.编写事件过滤器函数:
(由于QString命令中的需要获得鼠标的x,y坐标,但是鼠标的x,y坐标需要在QMouseEvent的类下才能获得,而这与参数event的类QEvent不一样,所以需要选中部分的命令来转换类型。)
(第一个if语句判断是哪个控件,第二个if语句判断的是哪个事件)
(然后else里的命令同“event函数改写”中的作用相同,都是为了不影响其他事件和控件)
五。猜数字游戏(此视频跳过)
1.进度条倒计时:
(1)设置一个参数time
(2)每次定时器中断,使time–,并把time值赋给进度条的参数。
六。画背景图:
- 步骤:
(1)创建QWidget类项目
(2)在头文件中声明paintEvent函数:
(3)编写paintEvent函数:(1.创建画家对象。2.指定当前窗口为绘图设备。3.绘图操作,此处为用p.drawPixmap来画背景图,并设置为背景图大小随窗口改变而改变):
(4)结果:
六。简单绘图(在五。的基础上编写编程)(比较简单可以百度搜,不详细介绍)
1.定义画笔(画刷):
2.将画笔(画刷)给画家:
3.画线/画矩形/画圆/填充: