事件处理

QT中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等。QT中,任何QObject子类示例都可以接收和处理事件。实际编程中通常实现部件的paintEvent()、mousePressEvent()等事件处理函数来处理特定部件的特定事件。

每个程序的main函数最后都会调用QApplication类的exec()函数,它会使QT应用程序进入到事件循环,使应用程序在运行的时候接收各种事件。一旦有事件发生,QT便会构造一个相应的QEvent子类的对象来表示它,然后将它传递给QObject对象或子对象。


鼠标事件

对鼠标实现进行重写来实现你想要达到的功能

mouseevent.h

#ifndef MOUSEEVENT_H
#define MOUSEEVENT_H#include <QMainWindow>
#include<QLabel>
#include<QMouseEvent>
namespace Ui {
class MouseEvent;
}class MouseEvent : public QMainWindow
{Q_OBJECTpublic:explicit MouseEvent(QWidget *parent = 0);~MouseEvent();
protected:void mousePressEvent(QMouseEvent *event);//鼠标按下void mouseMoveEvent(QMouseEvent *event);//鼠标移动void mouseReleaseEvent(QMouseEvent *event);//鼠标释放
private:Ui::MouseEvent *ui;QLabel *m_statusLabel;QLabel* m_posLabel;
};#endif // MOUSEEVENT_H

mouseevent.cpp

#include "mouseevent.h"
#include "ui_mouseevent.h"MouseEvent::MouseEvent(QWidget *parent) :QMainWindow(parent),ui(new Ui::MouseEvent)
{ui->setupUi(this);setWindowTitle(QString("鼠标事件"));m_statusLabel = new QLabel(QString("当前位置:"));m_statusLabel->setFixedWidth(100);m_posLabel = new QLabel(QString(""));m_posLabel->setFixedWidth(100);statusBar()->addPermanentWidget(m_statusLabel);//状态栏添加永久部件statusBar()->addPermanentWidget(m_posLabel);
}MouseEvent::~MouseEvent()
{delete ui;
}void MouseEvent::mousePressEvent(QMouseEvent *event)
{QString str = "("+QString::number(event->x())+","+QString::number(event->y())+")";if(event->button() == Qt::LeftButton){statusBar()->showMessage(QString("左键:") +str );}else if(event->button() == Qt::MidButton){statusBar()->showMessage(QString("中键:")+str);}else if(event->button() == Qt::RightButton){statusBar()->showMessage(QString("右键")+str);}
}void MouseEvent::mouseMoveEvent(QMouseEvent *event)
{QString strPos;strPos = "(" + QString::number(event->x())+","+QString::number(event->y())+")";m_posLabel->setText(strPos);
}void MouseEvent::mouseReleaseEvent(QMouseEvent *event)
{QString strPos;strPos = "(" + QString::number(event->x())+","+QString::number(event->y())+")";statusBar()->showMessage(QString("释放在:")+strPos,3000);
}


键盘事件

通过重写键盘事件来达到你想要实现的效果

keyevent.h

#ifndef KEYEVENT_H
#define KEYEVENT_H#include <QWidget>
#include<QKeyEvent>
namespace Ui {
class KeyEvent;
}class KeyEvent : public QWidget
{Q_OBJECTpublic:explicit KeyEvent(QWidget *parent = 0);~KeyEvent();void drawPix();void keyPressEvent(QKeyEvent *event) override;void paintEvent(QPaintEvent* event)override;private:Ui::KeyEvent *ui;QPixmap *m_pix;QImage m_image;int m_startX;      //图标顶点位置int m_startY;int m_width;       //界面的宽度,高度int m_height;int m_step;         //步长};#endif // KEYEVENT_H

keyevent.cpp

#include "keyevent.h"
#include "ui_keyevent.h"
#include<QPainter>
#include<QPen>
KeyEvent::KeyEvent(QWidget *parent) :QWidget(parent),ui(new Ui::KeyEvent)
{ui->setupUi(this);setWindowTitle(QString("键盘事件"));setAutoFillBackground(true);setFixedSize(521,256);m_width = size().width();m_height = size().height();m_pix = new QPixmap(m_width,m_height);m_pix->fill(Qt::white);m_image.load("picture.jpg");m_startX = 100;m_startY = 100;m_step = 20;drawPix();}KeyEvent::~KeyEvent()
{delete ui;
}void KeyEvent::drawPix()
{m_pix->fill(Qt::white);QPainter painter(this);QPen pen(Qt::DotLine);//按照步长画纵向网格线//bagin与end成对出现for(int i = m_step;i < m_width; i+=m_step){painter.begin(m_pix);//指定m_pix为绘图设备painter.setPen(pen);//设置笔painter.drawLine(QPoint(i,0),QPoint(i,height()));painter.end();}//按照步长画水平网格线for(int j = m_step;j < m_height;j += m_step){painter.begin(m_pix);//指定m_pix为绘图设备painter.setPen(pen);//设置笔painter.drawLine(QPoint(0,j),QPoint(m_width,j));painter.end();}//画图片painter.begin(m_pix);painter.drawImage(QPoint(m_startX,m_startY),m_image);painter.end();
}void KeyEvent::keyPressEvent(QKeyEvent *event)
{//按下ctrl,每次移动为1个像素if(event->modifiers() == Qt::ControlModifier){if(event->key() == Qt::Key_Left){m_startX = (m_startX -1)<0 ? m_startX : m_startX-1;}if(event->key() == Qt::Key_Right){m_startX = (m_startX +1+m_image.width()) > m_width ? m_startX :m_startX+1 ;}if(event->key() == Qt::Key_Up){m_startY = (m_startY - 1) < 0 ? m_startY:m_startY -1;}if(event->key() == Qt::Key_Down){m_startY = (m_startY +1 +m_image.height()) > m_height ? m_startY:m_startY+1;}}else//没有按ctrl键,每一移动为一个步长{//调整图标左上角位置到网格顶点顶点上m_startX = m_startX - m_startX % m_step;m_startY  =m_startY - m_startY % m_step;if(event->key() == Qt::Key_Left){m_startX = (m_startX -m_step)<0 ? m_startX : m_startX-m_step;}if(event->key() == Qt::Key_Right){m_startX = (m_startX +m_step+m_image.width()) > m_width ? m_startX :m_startX+m_step ;}if(event->key() == Qt::Key_Up){m_startY = (m_startY - m_step) < 0 ? m_startY:m_startY -m_step;}if(event->key() == Qt::Key_Down){m_startY = (m_startY +m_step +m_image.height()) > m_height ? m_startY:m_startY+m_step;}}drawPix();//根据调整后的图标位置重新在m_pix上绘制图像update();//触发窗口重绘
}void KeyEvent::paintEvent(QPaintEvent *event)
{QPainter painter;painter.begin(this);painter.drawPixmap(QPoint(0,0),*m_pix);painter.end();
}


事件过滤

指定某个对象对什么事件进行处理。

**示例:**鼠标按压对指定图片进行缩放

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include<QLabel>
#include<QImage>
#include<QHBoxLayout>
#include<QEvent>
#include<QMouseEvent>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0,Qt::WindowFlags f = 0);~Dialog();
public slots:bool eventFilter(QObject*watched ,QEvent *event)override;
private:QLabel *m_label1;QLabel *m_label2;QLabel *m_label3;QLabel *m_stateLabel;QImage m_image1;QImage m_image2;QImage m_image3;};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include<QHBoxLayout>Dialog::Dialog(QWidget *parent,Qt::WindowFlags f): QDialog(parent,f)
{setWindowTitle(QString("事件过滤"));m_label1 = new QLabel;m_label2 =new QLabel;m_label3 = new QLabel;m_stateLabel = new QLabel(QString("鼠标按下标志"));m_stateLabel->setAlignment(Qt::AlignHCenter);//水平居中m_image1.load("fly1.png");m_image2.load("fly2.png");m_image3.load("fly3.png");m_label1->setPixmap(QPixmap::fromImage(m_image1));m_label2->setPixmap(QPixmap::fromImage(m_image2));m_label3->setPixmap(QPixmap::fromImage(m_image3));//添加水平布局QHBoxLayout *layout = new QHBoxLayout;layout->addWidget(m_label1);layout->addWidget(m_label2);layout->addWidget(m_label3);QVBoxLayout*mainLayout = new QVBoxLayout(this);mainLayout->addLayout(layout);mainLayout->addWidget(m_stateLabel);resize(m_image2.width() * 3,m_image2.height() *2);//给图片标签部件安装事件过滤,并且指定整个窗体为监视事件的对象。m_label1->installEventFilter(this);m_label2->installEventFilter(this);m_label3->installEventFilter(this);}Dialog::~Dialog()
{}//对象-事件
bool Dialog::eventFilter(QObject *watched, QEvent *event)
{QMatrix matrix;//放大比例QImage tmpImg;//保存处理过后的图片//放大图片matrix.scale(2.0,2.0);//对象if(watched == m_label1){//鼠标按下事件的处理if(event->type() == QEvent::MouseButtonPress){//转换事件类型Wie鼠标事件QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->button() & Qt::LeftButton){m_stateLabel->setText(QString("左键按下图片1"));}if(mouseEvent->button() & Qt::MidButton){m_stateLabel->setText(QString("中键按下图片1"));}if(mouseEvent->button() & Qt::RightButton){m_stateLabel->setText(QString("右键按下图片1"));}//将原本图片缩放用tmpImg临时存储,设置图片tmpImg = m_image1.transformed(matrix);m_label1->setPixmap(QPixmap::fromImage(tmpImg));}//鼠标释放,恢复图片大小if(event->type() == QEvent::MouseButtonRelease){m_stateLabel->setText(QString("鼠标释放图片1"));m_label1->setPixmap(QPixmap::fromImage(m_image1));}}else if(watched ==m_label2){if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->button() & Qt::LeftButton){m_stateLabel->setText(QString("左键按下图片2"));}if(mouseEvent->button() & Qt::MidButton){m_stateLabel->setText(QString("中键按下图片2"));}if(mouseEvent->button() & Qt::RightButton){m_stateLabel->setText(QString("右键按下图片2"));}tmpImg = m_image2.transformed(matrix);m_label2->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type() == QEvent::MouseButtonRelease){m_stateLabel->setText(QString("鼠标释放图片2"));m_label2->setPixmap(QPixmap::fromImage(m_image2));}}else if(watched ==m_label3){if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->button() & Qt::LeftButton){m_stateLabel->setText(QString("左键按下图片3"));}if(mouseEvent->button() & Qt::MidButton){m_stateLabel->setText(QString("中键按下图片3"));}if(mouseEvent->button() & Qt::RightButton){m_stateLabel->setText(QString("右键按下图片3"));}tmpImg = m_image3.transformed(matrix);m_label3->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type() == QEvent::MouseButtonRelease){m_stateLabel->setText(QString("鼠标释放图片3"));m_label3->setPixmap(QPixmap::fromImage(m_image3));}}//事件交给上层对话框进行处理return QDialog::eventFilter(watched,event);
}

【QT】QT事件处理相关推荐

  1. QT+高德地图Web服务API开发—静态地图开发Demo。QT组件提升、QT鼠标事件处理、Qt图片显示与移动、QT网络操作

    说明 在本次项目中,我们使用QT开发框架,高德地图Web服务地图API,完成一个项目Demo,进行一次对QT.对编程的学习. 本系类文章所包含内容包括: 1.QT组件提升 2.QT鼠标事件处理 3.Q ...

  2. QT——Qt QtCreator 官方下载地址

    [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <项目案例分享> <极客DIY开源分享> <嵌入式通用开发实战> <C++语言开发基 ...

  3. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  4. Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤

    Qt | Qt For Android.Qt5.14.2安卓开发环境搭建详细步骤 目录 Qt | Qt For Android.Qt5.14.2安卓开发环境搭建详细步骤 1.简介 2.软件下载 1.J ...

  5. QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

    本文主要记录一下如何在 QT5.14.2 中配置 MSVC2017 构建套件,以及在VS2017中配置QT的开发环境.开发环境为 Win10 +  QT5.14.2 + Visual Studio 2 ...

  6. QT中事件处理、事件过滤器、拖放事件分析

    Qt: 事件过滤器 obj->installEventFilter(filterObject);常常是obj->installEventFilter(this). 发送到obj的所有事件, ...

  7. qt Qt Table Widget item 设置 选中 透明色

    表格单元格选中,调整透明色. 前提 先进行布局,后放置控件. // 选中 设置 背景色if (item->checkState() == Qt::Checked){item->setTex ...

  8. Hello Qt——Qt信号槽机制源码解析

    基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...

  9. linux 界面工具 qt,Qt主窗口中的工具栏

    工具栏类 QToolBar 快捷项 QAcitonQToolBar* tb = addToolBar("Tool Bar");//addToolBar是Qt主窗口的成员函数,在主窗 ...

  10. [Qt]Qt程序发布:在ubuntu下打包成Debian包的过程

    0:在ubuntu下将Qt程序打包,发布成Debian包的过程 下面的步骤对于所有的打包程序都是通用的,所以完全可以写一个脚本,把这个包过程自动化,但是在自动化之前,我们需要弄清楚,一步一步打包是如何 ...

最新文章

  1. java split array_Java如何循环数组并使用Split
  2. 典型问题分析(十五)
  3. 决定系数 均方误差mse_回归模型评价指标 SSE, MSE、RMSE、MAE、R-SQUARED
  4. FreeBSD 安装过程
  5. 剑指 Offer 03——10
  6. k8s查看pod的yaml文件_每天5分钟|轻松掌握开发工作中必会的k8s-yaml配置说明和常用命令...
  7. 【英语学习】【WOTD】raddled 释义/词源/示例
  8. git如何合并指定文件内容_Git合并指定文件到另一个分支
  9. 谈谈CSMA/CD,TCP中的二进制指数退避算法
  10. android gms集成方法
  11. mapbox gl文字标注算法基本介绍
  12. 聚合物/硅胶色谱填粒径1.7μm到50μm
  13. 中国GDP与百姓收入
  14. 奖学金——信息学奥赛一本通1179题解
  15. 海外app应用市场分享!
  16. [从源码学设计]蚂蚁金服SOFARegistry之服务上线
  17. python批量处理照片为可打印的黑底白字图片
  18. cocos:MotionStreak拖尾渐隐效果
  19. 汉字编码问题(附编码察看器)
  20. 计算机毕业设计SSM 家乡旅游文化推广网站【附源码数据库】

热门文章

  1. 5G物联网数据网关助力工业企业转型升级
  2. Android__逆向__xpose使用
  3. React——插件集合
  4. Mac上SecureCRT破解
  5. c语言谱曲软件,基于C语言的音乐谱曲技巧与应用研究
  6. 华为转正答辩ppt范文_华为新员工转正答辩
  7. asp.net mysql 论坛源码_最新asp.net微信商城快速开发框架Magicodes.Shop微商城开发框架源码企业商业版源代码...
  8. 开发java超级玛丽的素材_超级玛丽完整素材
  9. 网站的LOGO尺寸大小参考
  10. PDF如何添加下划线 捷速PDF编辑器一键搞定