千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:合肥千锋IT培训  >  技术干货  >  QT使用教程之事件

QT使用教程之事件

来源:千锋教育
发布人:qyf
时间: 2023-02-13 17:35:57

  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

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

unity快捷键大全

2023-08-28

unity射线检测多个物体

2023-08-28

unity富文本字体大小

2023-08-28

最新文章NEW

unity性能优化指标

2023-08-28

unity开发常用框架

2023-08-28

unity玻璃材质球

2023-08-28

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>