Qt事件介绍
protected:
// 按键
virtual void keyPressEvent(QKeyEvent *event);
virtual void keyReleaseEvent(QKeyEvent *event);
// 鼠标
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
// 滚轮
virtual void wheelEvent(QWheelEvent *event);
// 事件过滤
virtual bool eventFilter(QObject *watched, QEvent *event);
事件介绍
事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通 称。在Qt中使用一个对象来表示一个事件,它继承自QEvent类。
常见事件:鼠标事件、键盘事件、定时事件、上下文菜单事件、关闭事件、拖放事 件、绘制事件、触摸屏事件。
事件的处理
- 重载相关的Event函数
- 重新实现事件的paintEvent(),mousePressEvent()等事件处理函数。这是最常用的一种方法,不过他只能用来处理特定部件的特定事件。例如实现拖放操作等
- 安装事件过滤器:在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件
键盘事件
QKeyEvent
QKeyEvent类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事 件便会被发送给拥有键盘输入焦点的部件。
keyPressEvent接口
在头文件中敲入 keyPressEvent,然后按住Ctrl + 鼠标左键找到虚函数接口,在qwidget.h中
复制到头文件中,保持protected属性不变
protected:
virtual void keyPressEvent(QKeyEvent *event);
按键按下事件
- keyPressEvent
- event->key()
void Widget::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_X){
qDebug()<< "key_X is pressed";
}
}
组合按键按下事件
- keyRelease Event
- event->modifiers()
组合按键需要借助Ctrl和Shift等按键,在Qt中又叫修饰按键(直译过来),这里需要使用 QKeyEvent的modifiers()函数来获取它们
//使用event‐ >modifiers判断功能按键(第一层按键);
if(event->modifiers() == Qt::ControlModifier){
// 第二层按键
if(event->key() == Qt::Key_T)
{
qDebug() << "Ctrl + Key_T is pressed";
}
else if(event->key() == Qt::Key_Z)
{
qDebug() << "Ctrl + Key_Z is pressed";
}
}
按键释放
- keyReleaseEvent
- event->key()
void Widget::keyReleaseEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_X){
qDebug()<< "key_X is Release";
}
}
鼠标与滚轮事件
- QMouseEvent
QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用QMouseEvent类可以获取鼠标是哪个键按下,还有鼠标指针的当前位置等信息。通过是重定义部件的鼠标事件处理函数来进行一些自定义的操作
- QWheelEvent
QWheelEvent类用来表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向 和距离。在滚轮事件处理函数中,使用QWheelEvent类的delta()函数获取了滚轮 移动的距离,每当滚轮旋转一下,默认的是15度,当滚轮向远离使用者的方向旋 转时,返回正值;当向着靠近使用者的方向旋转时,返回负值。这样便可以利用 这个函数的返回值来判断滚轮的移动方向。 delta()函数在复制、选中时很有用
void Widget::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
{
qDebug()<<"wheelFvent front";
}
else
{
qDebug()<<"wheelFvent back";
}
}
鼠标单击事件
- mousePressEvent
- Event->button()
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
qDebug()<<"鼠标左键按下";
}
else if(event->button() == Qt::RightButton){
qDebug()<<"鼠标右键按下";
}
else if(event->button() == Qt::MiddleButton){
qDebug()<<"鼠标滚轮按下";
}
}
鼠标释放事件
- event->button()
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
qDebug()<<"鼠标左键释放";
}
else if(event->button() == Qt::RightButton){
qDebug()<<"鼠标右键释放";
}
else if(event->button() == Qt::MiddleButton){
qDebug()<<"鼠标滚轮释放";
}
}
鼠标双击事件
- mouseDoubleClickEvent
- event->button
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
qDebug()<<"鼠标左键双击";
}
else if(event->button() == Qt::RightButton){
qDebug()<<"鼠标右键双击";
}
else if(event->button() == Qt::MiddleButton){
qDebug()<<"鼠标滚轮双击";
}
}
鼠标移动事件
- mouseMoveEvent
- setMouseTracking(true) 默认false(不跟踪鼠标,及只有鼠标按下时才追踪鼠标移动事件)
- event->pos()
- event->globalPos()
void Widget::mouseMoveEvent(QMouseEvent *event)
{
qDebug()<< QString(QStringLiteral("鼠标当前坐标为:(%1,%2)")).arg(event->pos().x()).arg(event->pos().y());
}
滚轮事件
- wheelEvent
Qt6中QWheelEvent的 delta() 改成 angleDelta().y(),pos() 改成 position()
void Widget::wheelEvent(QWheelEvent *event)
{
qDebug()<<event->angleDelta().x();
qDebug()<<event->angleDelta().y();
if(event->angleDelta().y() > 0){ // 当滚轮远离使用者时
qDebug()<<event->angleDelta().y(); // 进行放大
}else{ // 当滚轮向使用者方向旋转时
qDebug()<<event->angleDelta().x(); // 进行缩小
}
}
事件过滤器
使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。只要是对象或 者部件安装了事件过滤器,就会进入事件过滤器函数,eventFilter(QObject obj, QEvent event)。采用类似于mousePressEvent重写函数事件来实现此功能。
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->lineEdit)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
qDebug() << keyEvent->key();
if(keyEvent->key() == Qt::Key_T)
{
qDebug() << "Key_T is Released";
}
return true;
}
else
{
return false;
}
}
else
{
return Widget::eventFilter(watched, event);
}
}
定时器
- QTimeEvent
QTimerEvent类用来描述一个定时器事件。对于一个QObject的子类,只需要使 用int QObject::startTimer ( int interval )函数来开启一个定时器,这个函数需要输 入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来 代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取该定时器的 编号来进行相关操作
- QTimer
QTimer类来实现一个定时器,它提供了更高层次的编程接口,比如可以使用信号 和槽,还可以设置只运行一次的定时器
QTimeEvent事件定时器
- startTimer
- timerEvent
- event->timerld()
id1= startTimer(1000);
id2 = startTimer(2000);
id3= startTimer(3000);
id4 = startTimer(4000);
id5 = startTimer(5000);
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId() == id1)
{
qDebug() <<"timer1 timeout";
return;
}
if(event->timerId() == id2)
{
qDebug() <<"timer2 timeout";
return;
}
if(event->timerId() == id3)
{
qDebug() <<"timer3 timeout";
return;
}
if(event->timerId() == id4)
{
qDebug() <<"timer4 timeout";
return;
}
if(event->timerId() == id5)
{
qDebug() <<"timer5 timeout";
return;
}
}
QTimer定时器
connect(timer, SIGNAL(timeout()), this, SLOT(refreshTime()));
timer‐>start(1); //1秒定时器
随机数
随机数种子
可以使用QTime().secsTo设置随机数 在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不 设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。为了每次运行程 序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。
- 产生随机数种子
/* 指从零点整到当前时间所经过的秒数 */
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
- 得到随机数
int rand = qrand() % 300;