神马网站快速排名软件,wordpress数据过滤,wordpress缓存网站首页,企业标准化建设目录 1.定时器0.是什么#xff1f;1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么#xff1f;2.使用 1.定时器
0.是什么#xff1f;
在进⾏窗⼝程序的处理过程中#xff0c;经常要周期性的执⾏某些操作1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么2.使用 1.定时器
0.是什么
在进⾏窗⼝程序的处理过程中经常要周期性的执⾏某些操作或者制作⼀些动画效果使⽤定时器就可以实现定时器就是在间隔⼀定时间后去执⾏某⼀个任务Qt中的定时器分为QTimerEvent和QTimer这2个类 1.QTimerEvent
QTimerEvent⽤来描述⼀个定时器事件使用 startTimer()开启⼀个定时器 参数以毫秒为单位的整数作为参数来表明设定的时间返回值一个整形的身份标识代表这个定时器 当定时器溢出时(即定时时间到达)就可以在timerEvent()中获取该定时器的编号来进⾏相关操作killTimer关闭定时器 注意如果一个程序中存在多个定时器(startTimer创建的定时器)此时每个定时器都会触发timerEvent()示例// 构造函数中
{// 开启定时器事件.// 此处 timerId 是一个定时器的身份标识.timerId this-startTimer(1000);
}void Widget::timerEvent(QTimerEvent* event)
{// 先判定一下这次触发是否是想要的定时器触发的.if (event-timerId() ! this-timerId) {return;}int value ui-lcdNumber-intValue();if (value 0) {// 停止定时器this-killTimer(this-timerId);return;}value - 1;ui-lcdNumber-display(value);
}2.QTimer
QTimer底层是QTimerEventQTimer实现⼀个定时器它提供了更⾼层次的编程接⼝ 如可以使⽤信号和槽还可以设置只运⾏⼀次的定时器 示例QTimer* timer new QTimer(this);connect(ui-btn1, QPushButton::clicked, [](){timer-start(1000);
});connect(timer, QTimer::timeout, [](){static int num 1;ui-label-setText(QString::number(num));
});connect(ui-btn2, QPushButton::clicked, [](){timer-stop();
});3.获取系统⽇期及时间 在Qt中获取系统的⽇期及实时时间可以通过QTimer类和QDateTime类 QDateTime类提供了字符串格式的时间输出格式由toString()⽅法中的format参数列表决定 示例 // 构造函数中
{QTimer* timer new QTimer(this);connect(ui-btn1, QPushButton::clicked, [](){timer-start(1000);});connect(ui-btn2, QPushButton::clicked, [](){timer-stop();});connect(timer, QTimer::timeout, this, Widget::TimeUpdate);
}void Widget::TimeUpdate()
{QString t QDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss);ui-label-setText(t);
}2.事件分发器
1.概述
在Qt中事件分发器(EventDispatcher)是⼀个核⼼概念⽤于处理GUI应⽤程序中的事件 属于Qt事件机制背后的一些逻辑杀伤力比较广不当使用可能对现有逻辑造成一些负面影响一般不建议使用 事件分发器负责将事件从⼀个对象传递到另⼀个对象直到事件被处理或被取消每个继承⾃QObject类或QObject类本⾝都可以在本类中重写bool event(QEvent* e)来实现相关事件的捕获和拦截 2.事件分发器工作原理
在Qt中发送的事件都是传给了QObject对象更具体点是传给了QObject对象的event() 所有的事件都会进⼊到这个函数⾥⾯ 那么处理事件就要重写这个event()函数 event()函数本⾝不会去处理事件⽽是根据事件类型(type)调⽤不同的事件处理函数 事件分发器就是⼯作在应⽤程序向下分发事件的过程中 事件分发器⽤于分发事件在此过程中事件分发器也可以做拦截操作事件分发器主要是通过bool event(QEvent* e)来实现 返回值若为ture代表拦截不向下分发 3.使用 Qt中的事件是封装在QEvent类中其所包括的事件类型 示例拦截鼠标左键单击事件 void Widget::mousePressEvent(QMouseEvent* event)
{if(event-button() Qt::LeftButton){qDebug() 鼠标左键被按下;}
}bool Widget::event(QEvent* ev)
{if(ev-type() QEvent::MouseButtonPress){qDebug() Event中鼠标被按下;return true; // 返回true代表拦截不向下分发}// 其他事件交给父类处理(默认处理)return QWidget::event(ev);
}3.事件过滤器
0.是什么
在Qt中⼀个对象可能经常要查看或拦截另外⼀个对象的事件 例如对话框想要拦截按键事件不让别的组件接收到或者修改按键的默认值等属于Qt事件机制背后的一些逻辑杀伤力比较广不当使用可能对现有逻辑造成一些负面影响一般不建议使用 Qt创建了QEvent事件对象之后会调⽤QObject的event()函数处理事件的分发可以在event()函数中实现拦截的操作 由于event()是protected的因此需要继承已有类如果组件很多就需要重写很多个event() 这当然相当⿇烦更不⽤说重写event()还得⼩⼼⼀堆问题好在Qt提供了另外⼀种机制来达到这⼀⽬的事件过滤器 事件过滤器是在应⽤程序分发到event事件分发器之前再做⼀次更⾼级的拦截 2.使用
事件过滤器的⼀般使⽤步骤 安装事件过滤器重写事件过滤器函数eventfilter() 示例{void MyLabel::mousePressEvent(QMouseEvent* event){QString str QString(鼠标按下: x %1, y %2).arg(event-x()).arg(event-y());qDebug() str.toUtf8().data();}void MyLabel::event(QEvent* ev){if(ev-type() QEvent::MouseButtonPress){QMouseEvent* event static_castQMouseEvent* e(e);QString str QString(event中鼠标按下: x %1, y %2).arg(event-x()).arg(event-y());qDebug() str.toUtf8().data();return true; // 返回true代表拦截不向下分发}// 其他事件交给父类处理(默认处理)return QWidget::event(ev);}
}
----------------------------------------------------------------------
{// Widget构造函数中{// 步骤1给label安装事件过滤器 this:当前窗口安装事件过滤器ui-label-installEventFilter(this);}// 步骤2重写eventFilter事件bool Widget::eventFilter(QObject* obj, QEvent* e){if(obj ui-label) // 判断控件{if(e-type QEvent::MouseButtonPress){QMouseEvent* event static_castQMouseEvent* e(e);QString str QString(事件过滤器中鼠标按下: x %1, y %2).arg(event-x()).arg(event-y());qDebug() str.toUtf8().data();return true;}}// 其他事件交给父类处理return QWidget::event(ev);}
}