事件
事件的传递
新建Widget项目myevent,类名WIdget不变
新建C++类如下:
粘贴代码
1myevent运行结果:
输入任意字符时,qDebug显示如下,但框内无法显示输入的字符
//mylineedit.cpp中
void MyLineEdit::keyPressEvent(QKeyEvent *event) // 键盘按下事件
{
qDebug() << tr("MyLineEdit键盘按下事件");
QLineEdit::keyPressEvent(event); // 执行QLineEdit类的默认事件处理,在框内可显示字符
event->ignore(); // qDebug多一行提示:"Widget键盘按下事件"
}
解除如上部分代码的注释后
运行结果:框内可显示输入的字符,qDebug有两行输出
事件先传递给获得焦点的窗口(Line Edit),若该部件忽略该事件,则传递给部件的父窗口(Widget)
添加事件过滤器eventFilter后(直接运行2myevent)
2myevent运行结果:
可见,事件的传递顺序如下:
鼠标和滚轮事件
新建Widget项目mymouseevent,类名WIdget不变
ui界面拖用一个Text Edit
粘贴代码
运行结果:
(鼠标的变化,一般的截屏很难展示T_T)
主窗口界面的鼠标为小手掌,按下左键变为握紧的手掌,按下右键变为图片
双击进入全屏,双击再双击退出全屏
点击Text Edit内部,滚轮影响光标的长度
键盘事件
新建Widget项目mykeyevent,类名WIdget不变
粘贴代码
4mykeyevent运行结果:
按下ctrl+M,窗口最大化,相当于大多页面右上角这个方框的作用
一直按则自动重复
5mykeyevent运行结果:
按上时qDebug显示如下,一直按则一直增加如下显示
避免自动重复,实现两个键同时按下
6mykeyevent运行结果:
按左不放手,再按上,松开上时,按键斜移
定时器事件与随机数
新建Widget项目mytimeevent,类名WIdget不变
粘贴代码
7mytimeevent运行结果:
读取当前时间,每1秒随机移动,10秒后溢出自动关闭窗口
事件过滤器与事件的发送
8myeventfilter运行结果:
Text Edit中滚轮影响光标长度,Spin Box中按下空格归0
构造函数中,解除这两行代码的注释,Spin Box初始为1
// QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
//初始化键盘按下一次向上键,初始值变为1
// qApp->sendEvent(ui->spinBox, &myEvent);
// 发送键盘事件到spinBox部件
参考书目
Qt Creator快速入门第三版
本章代码及使用方法
本章代码
遇到各种提示都点“OK”或者“Yes”(主要是关于版本的兼容性提示)
遇到如下问题的解决方法:
在“项目”模式的“Build & Run”点击“绿色加号”(任选一个),再回到“编辑”模式
直接点击“绿色箭头”即可运行
该方法同样适用于打开Qt Creator自带的“欢迎”界面的案例项目