QT_事件类

常用事件

事件
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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值