全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货  >  详情

QT使用教程之事件

来源:千锋教育
发布人:qyf
2023-02-13

推荐

在线提问>>

  1、事件概述

  事件经过以下:事件派发----》事件过滤器----》事件分发---》事件处理阶段。

  事件:系统或者 Qt 本身在不同的时刻发出的。

  事件循环开始:exec()函数。

  2、常见事件函数

  帮助文档:

图片 1

图片 2

图片 3

  3、重写窗口关闭、窗口重新设置大小事件

  步骤1:新增一个类继承于QWidget(新建工程)

  步骤2:子类.h声明重写的事件函数

  protected:

  void closeEvent(QCloseEvent *event);

  void resizeEvent(QResizeEvent *event);

  步骤3:子类的.cpp去实现事件函数

  void Widget::closeEvent(QCloseEvent *event)

  {

  int ret = QMessageBox::question(this,"提示","您确定要关闭窗口吗?");

  if(ret == QMessageBox::Yes)

  {

  event->accept();

  }

  else{

  event->ignore();

  }

  }

  void Widget::resizeEvent(QResizeEvent *event)

  {

  qDebug()<<"oldsize="<oldSize();

  qDebug()<<"newsize="<size();

  }

  4、鼠标按下、释放,移动事件

  步骤1:新建label类继承QLabel(新建工程,ui绘制label,新增c++类继承QWiget,代码修改继承QLabel,ui绘制label提升新创建label类)

  步骤2:查看帮助文档

图片 4

  步骤3:在mylabel.h声明事件函数

  protected:

  void mousePressEvent(QMouseEvent *ev);

  void mouseReleaseEvent(QMouseEvent *ev);

  void mouseMoveEvent(QMouseEvent *ev);

  步骤4:在mylabel.cpp实现事件函数

  #include

  #include

  MyLabel::MyLabel(QWidget *parent) : QLabel(parent)

  {

  this->setMouseTracking(true);//设置追踪模式

  }

  void MyLabel::mousePressEvent(QMouseEvent *ev)

  {

  if( ev->button() == Qt::LeftButton){

  qDebug()<<"鼠标左键按下了";

  }

  else if( ev->button() == Qt::RightButton)

  {

  qDebug()<<"鼠标右键按下了";

  }

  else{

  qDebug()<<"鼠标其他按下了";

  }

  }

  void MyLabel::mouseReleaseEvent(QMouseEvent *ev)

  {

  qDebug()<<"在标签上的鼠标释放了";

  }

  void MyLabel::mouseMoveEvent(QMouseEvent *ev)

  {

  qDebug()<<"鼠标移动"<x()<<","<y();

  QString str;

  str.sprintf("

    str.sprintf("<center><h1>(%d ,%d)</h1></center>",ev->x(),ev->y());

  this->setText(str);

  }

  5、重写事件分发函数(了解)

  案例:键盘事件:监听tab按键

  步骤1:.h声明event

  bool event(QEvent *event);

  步骤2:.cpp实现event

  bool Widget::event(QEvent *event)

  {

  //判断事件类型(键盘事件)

  if(event->type() == QEvent::KeyPress){

  //将QEvent类型的event转换类型为QKeyEvent

  QKeyEvent *keyEvent = static_cast(event);

  if(keyEvent->key() == Qt::Key_Tab){

  qDebug()<<"TAB被按下";

  return true;

  }

  }

  return QWidget::event(event);

  }

  注意:

  1、事件分发函数的返回值bool。

  2、我们处理过自己感兴趣的事件之后,可以直接返回 true,表示我们已经对此事件进行了处理;对于其它我们不关心的事件,则需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了。

  6、事件过滤器(了解)

  使用:重写

  步骤1:声明

  virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );

  步骤2:实现(先判断是否是要过滤事件的组件,如果是是要过滤事件的组件,再去判断事件是否过滤,如果过滤返回true,如果不过滤返回false;

  如果不是要过滤事件的组件,返回父类的事件过滤函数)

  bool MainWindow::eventFilter(QObject *obj, QEvent *event)

  {

  if (obj == textEdit) {

  if (event->type() == QEvent::KeyPress) {

  QKeyEvent *keyEvent = static_cast(event);

  qDebug() << "Ate key press" << keyEvent->key();

  return true;

  } else {

  return false;

  }

  } else {

  // pass the event on to the parent class

  return QMainWindow::eventFilter(obj, event);

  }

  }

  步骤3:安装

  void QObject::installEventFilter ( QObject * filterObj )

  步骤4:移除

  void QObject::removeEventFilter( QObject * filterObj )

  7、事件总结

  事件处理有以下四个过程:

  事件处理:重写鼠标按下事件、鼠标释放事件,这个是最简单的形式及功能。

  事件分发:重新event函数。

  事件过滤:重写eventFilter,过滤特定对象的事件,或者所有对象的所有事件(QCoreApplication::instance)。

  事件派发:(QCoreApplication::notify).

图片 5

相关文章

unity快捷键大全

unity射线检测多个物体

unity图集合并成图片

unity富文本字体大小

unity哪个版本免费

开班信息 更多>>

课程名称
全部学科
咨询

HTML5大前端

Java分布式开发

Python数据分析

Linux运维+云计算

全栈软件测试

大数据+数据智能

智能物联网+嵌入式

网络安全

全链路UI/UE设计

Unity游戏开发

新媒体短视频直播电商

影视剪辑包装

游戏原画

    在线咨询 免费试学 教程领取