4. QT中的事件函数

您所在的位置:网站首页 smorss键盘使用说明 4. QT中的事件函数

4. QT中的事件函数

2023-06-06 11:53| 来源: 网络整理| 查看: 265

1. 说明

在QT的控件或者窗口当中,如果对于当前鼠标或者键盘的功能需要自己定义,可以重写父类当中对应虚函数,主要包括以下几个:

//键盘按键按下 virtual void keyPressEvent(QKeyEvent *event); //键盘按键抬起 virtual void keyReleaseEvent(QKeyEvent *event); //鼠标离开 virtual void leaveEvent(QEvent *event); //鼠标双击 virtual void mouseDoubleClickEvent(QMouseEvent *event); //鼠标移动 virtual void mouseMoveEvent(QMouseEvent *event); //鼠标按下 virtual void mousePressEvent(QMouseEvent *event); //鼠标抬起 virtual void mouseReleaseEvent(QMouseEvent *event); //鼠标滚轮事件 virtual void wheelEvent(QWheelEvent *event); 2. 相关代码

使用鼠标移动时,需要在构造函数中开启鼠标追踪

this->setMouseTracking(true);

键盘响应代码:

void Widget::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_W: qDebug() case Qt::Key_W: qDebug() Q_UNUSED(event); qDebug() qDebug() qDebug() //设置图像源 this->setPixmap(pix); //设置父控件 this->setParent(parent); //设置图像比例填充 this->setScaledContents(true); this->mSpeed = 10; //处理键盘事件需要先获取焦点 this->setFocusPolicy(Qt::StrongFocus); } void ImageLabel::mousePressEvent(QMouseEvent *event) { //记录鼠标开始点击时的初始位置向量 mousePressPos = event->pos(); } void ImageLabel::mouseMoveEvent(QMouseEvent *event) { //求鼠标移动偏移量(向量) QPoint deltaMove = event->pos() - mousePressPos; //此时鼠标移动了,但是控件本身位置还没有加上偏移量,还未移动 //求窗口新位置(当前位置 + 偏移量) this->move(this->pos() + deltaMove); } void ImageLabel::keyPressEvent(QKeyEvent *event) { qDebug() QPoint pos = this->pos() + QPoint(0,-1) * mSpeed; this->move(pos); break; } case Qt::Key_S:{ QPoint pos = this->pos() + QPoint(0,1) * mSpeed; this->move(pos); break; } case Qt::Key_A:{ QPoint pos = this->pos() + QPoint(-1,0) * mSpeed; this->move(pos); break; } case Qt::Key_D:{ QPoint pos = this->pos() + QPoint(1,0) * mSpeed; this->move(pos); break; } } }

然后再在主窗口中使用自定义类创建图片控件即可:

//使用label在窗口上添加一个图片 QPixmap piximg(":/imgs/images/tt.png"); ImageLabel *imgLab = new ImageLabel(piximg,this); imgLab->move(50,100);//定义初始位置

效果展示:

鼠标键盘移动自定义控件

4. 定时器事件

如果想每间隔一段时间就去做某件事情,可以重写定时器事件函数,实例代码如下: widget.h:

#ifndef WIDGET_H #define WIDGET_H #include class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); protected: //重写父类的定时器虚函数 virtual void timerEvent(QTimerEvent* event) override; private: //声明两个变量,用于接收定时器的ID号 int playerTimerID; int monsterTimerID; }; #endif // WIDGET_H

widget.cpp:

#include "widget.h" #include #include Widget::Widget(QWidget *parent) : QWidget(parent) { //开启玩家定时器 playerTimerID = this->startTimer(1000); //开启怪物定时器 monsterTimerID = this->startTimer(2000); //除了使用startTimer外,也可以使用QTimer类定义定时器对象实现 } Widget::~Widget() { } void Widget::timerEvent(QTimerEvent *event) { if(event->timerId() == this->playerTimerID){ qDebug()monsterTimerID){ qDebug() //初始化画家 mPainter = new QPainter(this); mTimer= new QTimer(this); mTimer->start(100); //绘画事件有一个update()函数,当画布发生了新的绘制时,应该调用这个函数让画布更新,这里采用定时器进行刷新 connect(mTimer,&QTimer::timeout,[this](){this->update();}); } Widget::~Widget() { } void Widget::paintEvent(QPaintEvent *event) { /*画家准备工作*/ //创建画笔 QPen pen(QColor(0,0,125)); //给画家添加画笔 mPainter->setPen(pen); //开启绘制 mPainter->begin(this);//即使有多个画家存在,这个开始函数也只需要其中一个画家调用一次就行了 //开始绘制直线 mPainter->drawLine(0,0,100,100); //绘制矩形 mPainter->drawRect(100,100,200,50); //绘制椭圆 mPainter->drawEllipse(150,150,50,25); //绘制图片 QImage img(":/imgs/imgs/girl.jpg"); mPainter->translate(100,200);//画家平移 mPainter->rotate(45.0);//画家旋转 mPainter->drawImage(QRect(0,0,100,100),img); mPainter->drawImage(QRect(0,0,200,200),img,QRect(200,0,200,200));//指定绘制区域位置 /* 第一个参数:(0,0)代表图片的左上角,(200,200)设定图片的大小 第二个参数:图片源 第三个参数:(200,0)指定在整张图片上选择的开始绘制点,(200,200)指绘制的尺寸 */ //结束绘制 mPainter->end(); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3