当前位置:网站首页>QT_事件类
QT_事件类
2022-08-01 17:33:00 【小小工程员】
常用事件
事件
QWidget 类能够处理类型丰富的事件,这里将介绍一些常用的事件处理函数。
窗口事件:
virtual void closeEvent(QCloseEvent *event); // 关闭
virtual void showEvent(QShowEvent *event); // 显示
virtual void hideEvent(QHideEvent *event); // 隐藏
virtual void moveEvent(QMoveEvent *evnet); // 移动
virtual void resizeEvent(QResizeEvent *event); // 改变大小
这里通过QMoveEvent 类的以下成员函数可以获得窗口的旧坐标和新坐标:
const QPoint &oldPos() const; // 旧坐标
const QPoint &newPos() constl // 新坐标
通过QResizeEvent 类的以下成员函数可以获得窗口的旧大小和新大小:
const QSize &oldSize() const; // 旧大小
const QSize &newSize() const; // 新大小
键盘事件:
virtual void keyPressEvent(QKeyEvent *event); // 键按下
virtual void keyReleaseEvent(QKeyEvent *event); // 键松开
这里通过QKeyEvent 类的成员函数可以获得关于按键的一些信息,如:
int key() const; // 得到键值
鼠标事件:
virtual void mousePressEvent(QMouseEvent *event); // 鼠标键按下
virtual void mouseReleaseEvent(QMouseEvent *event); // 鼠标键松开
virtual void mouseDoubleCllckEvent(QMouseEvent *event); // 鼠标键双击
virtual void mouseMoveEvent(QMouseEvent *event); // 鼠标移动
virtual void enterEvent(QEvent *event); // 鼠标进入窗口
virtual void leaveEvent(QEvent *event); // 鼠标离开窗口
virtual void wheelEvent(QWheelEvent *event); // 鼠标滚轮移动
这里通过QMouseEvent 事件的成员函数可获得关于鼠标的信息,如:
const QPoint &pos() const; // 得到鼠标坐标(相对于接收事件的窗口)
int x() const; // 得到鼠标横坐标(相对于接收事件的窗口)
int y() const; // 得到鼠标纵坐标(相对于接收事件的窗口)
const QPoint &globalPos() const; // 得到鼠标坐标(全局坐标)
int globalX() const; // 得到鼠标横坐标(全局坐标)
int globalY() const; // 得到鼠标纵坐标(全局坐标)
Qt::MouseButton button() const; // 得到引起事件的鼠标键
Qt::MouseButtons buttons() const; // 得到事件发生时的鼠标键状态
其中,Qt::MouseButton 是一个枚举类型,有以下常用取值。
1)Qt::NoButton: 无键。
2)Qt::LeftButton: 左键。
3)Qt::RightButton:右键。
4)Qt::MidButton: 中键。
注意,对于鼠标移动事件QMouseEvent 和button 函数总是返回Qt::NoButton,而buttons函数返回值则是Qt::MouseButton 类型的“按位或” 组合,它能反映事件发生时鼠标键的按下状态。
QWheelEvent 类代表滚轮事件,它有一套与QMountEvent 类几乎相同的成员函数,但少一个button 函数,多以下两个函数:
int delta() const; // 获得滚轮转动的角度
Qt::Orientation orientationI() const; // 获得滚轮转动的方向
其中Qt::Orientation 是一个枚举类型,它有以下取值。
1)Qt::Horizontal: 横向。
2)Qt::Vertical: 纵向。
焦点事件:
virtual void focusInEvent(QFocusEvent *event); // 获得焦点
virtual void focusOutEvent(QFocusEvent *event); // 失去焦点
这些事件处理函数都没有返回值,因此如果要接受或拒绝和一个事件要调用QEvent 类的成
员函数,如:
event->accept(); // 接受事件
event->ignore(); // 拒绝事件
事件被拒绝后的结果视具体情况而定,比如关闭事件被拒绝后,窗口将不会被关闭,而键盘、鼠标等输入事件被拒绝后会向上传播到父窗口。
键盘事件
捕获键盘和鼠标事件窗口部件即使获得焦点,也不一定能获得按键事件,因为其他窗口可能会捕获键盘事件。捕获了键盘事件的窗口将得到所有键盘事件,而其他窗口将完全得到不到键盘事件,直到捕获了键盘事件的窗口释放键盘事件。与键盘事件捕获相关的成员函数如下:
void grabKeyboard(); // 捕获键盘事件
void releaseKeyboard(); // 释放键盘事件
类似的还有鼠标事件的捕获和释放,其成员函数如下:
void grabMouse(); // 捕获鼠标事件
void releaseMouse(); // 释放鼠标事件
对键盘事件和鼠标事件的捕获是相互独立的。这里要注意两点:
一是如果有另外一个窗口进行了捕获操作,则当前处于捕获状态的窗口将失去对事件的捕获;
二是只有可见的窗口才能进行输入事件捕获。
以下的成员函数能够得到应用程序中正在捕获键盘或鼠标事件的窗口:
QWidget *keyboardGrabber(); // 得到正在捕获键盘事件的窗口
QWidget *mouseGrabber(); // 得到正在捕获鼠标事件的窗口
这两个函数是静态函数。
定时事件
1. 单独一个计时操作
startTimer(40); //40MS刷新一次
void XVideoUI::timerEvent(QTimerEvent* e)
{
if (pressSlider)return; //进度条拖动的时候,就不要定时器刷新了,防止冲突
double pos = XVideoThread::Get()->GetPos(); //获取到位置
ui.playSlider->setValue(pos * 1000); //转换为千分数
}
2.判断时间事件的ID
timer = startTimer(1000);
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId() == timer)
{
readFrame();
update();
}
}
killTimer(timer); //结束定时
3.事件槽
QTimer *timer=new QTimer(this); //新建一个定时器对象
connect(timer,SIGNAL(timeout()),this,SLOT(showTime())); //(d)
timer->start(1000); //(e)
绘图事件
程序产生事件有两种方式,一种是调用QApplication::postEvent(), 例如QWidget::update()函数,当需要重新绘制屏幕时,程序调用update()函数,放入Qt的消息队列中,等待依次被处理;postEvent()中事件对象的生命期由Qt 平台管理,只支持分配在堆上的事件对象,事件被处理后由Qt 平台销毁。
另一种方式是调用sendEvent() 函数, 事件不会放入队列, 而是直接被派发和处理,QWidget::repaint()函数用的就是阻塞型的。sendEvent()中事件对象的生命期由Qt 程序管理,支持分配在栈上和堆上的事件对象;
#include <QPainter>
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
}
鼠标事件
#include <QMouseEvent>
setWindowFlags(Qt::FramelessWindowHint); //(b) 无边框,标题栏
setWindowOpacity(0.5); //(c) 窗体透明度0.5
void DigiClock::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
dragPosition=event->globalPos()-frameGeometry().topLeft();//保存当前鼠标点所在的位置相对于窗体左上角的偏移值
event->accept();
}
if(event->button()==Qt::RightButton)
{
close();
}
}
void DigiClock::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton)
{
move(event->globalPos()-dragPosition);//move参数指的是窗体左上角位置!!
event->accept();
}
}
边栏推荐
猜你喜欢
TCP百万并发服务器优化调参
MySQL's maximum recommended number of rows is 2000w, is it reliable?
Ali's official Redis development specification
Detailed explanation of the working principle of crystal oscillator
TCP million concurrent server optimization parameters
生物制药产业发展现状和趋势展望
MySql 怎么查出符合条件的最新的数据行?
完全背包问题求组合数和排列数
后台管理系统的权限思路
MySQL加锁案例分析
随机推荐
04 flink cluster construction
小贝拉机器人是朋友_普渡科技召开新品发布会,新一代送餐机器人“贝拉”温暖登场...
GRUB2的零日漏洞补丁现已推出
C # Excel helper classes
UI helper class for Winform - some components will use DevExpress components
银行案例|Zabbix跨版本升级指南,4.2-6.0不香吗?
生物制药产业发展现状和趋势展望
Path helper class for C#
C# LibUsbDotNet 在USB-CDC设备的上位机应用
深圳市商务局2022年度中央资金(跨境电子商务企业市场开拓扶持事项)申报指南
2022.08月--pushmall推贴共享电商更新与开发计划
2022年深圳市促进大健康产业集群高质量发展的若干措施
【二叉树】奇偶树
C#的DateTime帮助类
Winform message prompt box helper class
浅谈游戏音效测试点
GridControl helper class for DevExpress
请问数据库中报错信息如下,mongoshake 有什么配置的方式解决这种大消息问题吗?
2022年SQL经典面试题总结(带解析)
云商店携手快报税,解锁财务服务新体验!