当前位置: 首页 > news >正文

给自己企业怎么做网站网页设计蛋糕图片素材

给自己企业怎么做网站,网页设计蛋糕图片素材,装饰公司招聘,洛阳有哪些做网站的公司第三章Qt事件系统 文章目录 第三章Qt事件系统1.事件系统事件是如何传递的事件类型事件处理发送事件 2.事件传播机制事件接受和忽略事件分发事件过滤 3.事件和信号的区别 1.事件系统 在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情&am…

第三章Qt事件系统

文章目录

  • 第三章Qt事件系统
  • 1.事件系统
    • 事件是如何传递的
    • 事件类型
    • 事件处理
    • 发送事件
  • 2.事件传播机制
    • 事件接受和忽略
    • 事件分发
    • 事件过滤
  • 3.事件和信号的区别

1.事件系统

在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情,或应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理。
Qt程序需要在main函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始Qt的事件循环。执行后,程序将进入事件循环来监听应用程序的事件,当事件发生时,Qt将创建一个事件对象。

事件是如何传递的

通过
QCoreApplication::sendEvent()
发送事件
用户触发事件
操作系统接收
将事件分发给对应的应用程序
应用程序事件过滤器处理
nativeEventFilter()
通过
QCoreApplication::postEvent()
发送事件
事件队列
事件分发给对应控件
QApplication::notify()
控件事件过滤处理
QObject::eventFilter()
将事件进行分发
QObject::event()
控件处理
例如mousePressEvent()
忽略该事件
控件的父级处理

事件类型

#include <QWidget>
#include <QMouseEvent>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected://鼠标事件void mouseDoubleClickEvent(QMouseEvent *)override;void mousePressEvent(QMouseEvent *)override;void mouseReleaseEvent(QMouseEvent *)override;void mouseMoveEvent(QMouseEvent *)override;//按键事件void keyPressEvent(QKeyEvent *)override;void keyReleaseEvent(QKeyEvent * )override;//窗口事件void closeEvent(QCloseEvent *) override;void hideEvent(QHideEvent *)override;void resizeEvent(QResizeEvent *)override;//焦点事件void focusInEvent(QFocusEvent*)override;void focusOutEvent(QFocusEvent*)override ;void contextMenuEvent(QContextMenuEvent*)override;//程序状态改变事件void changeEvent(QEvent*)override;//定时器事件void timerEvent(QTimerEvent*)override;
};

事件处理

#include "Widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{this->setMouseTracking(false);//启用鼠标追踪this->setFocus();new QPushButton("按钮",this);this->startTimer(10);//10毫秒
}Widget::~Widget() {}void Widget::mouseDoubleClickEvent(QMouseEvent *)
{qInfo()<<"鼠标双击";
}void Widget::mousePressEvent(QMouseEvent *)
{qInfo()<<"鼠标按下";
}void Widget::mouseReleaseEvent(QMouseEvent *)
{qInfo()<<"鼠标释放";
}void Widget::mouseMoveEvent(QMouseEvent *)
{static int16_t i=0;qInfo()<<"鼠标移动"<<i++;
}void Widget::keyPressEvent(QKeyEvent *event)
{qInfo()<<event->text()<<"按键已按下";
}void Widget::keyReleaseEvent(QKeyEvent *event)
{auto k=event->key();qInfo()<<k<<"按键已弹起";
}void Widget::closeEvent(QCloseEvent *)
{qInfo()<<"窗口关闭";
}void Widget::hideEvent(QHideEvent *)
{qInfo()<<"窗口隐藏";
}void Widget::resizeEvent(QResizeEvent *)
{qInfo()<<"窗口大小改变";
}void Widget::focusInEvent(QFocusEvent *)
{qInfo("有焦点");
}void Widget::focusOutEvent(QFocusEvent *)
{qInfo("失去焦点");
}void Widget::contextMenuEvent(QContextMenuEvent *)
{qInfo()<<"收到信号,弹出菜单";
}void Widget::changeEvent(QEvent *e)
{if(e->type()==QEvent::WindowStateChange)qInfo()<<"发生改变";
}void Widget::timerEvent(QTimerEvent *)
{static qint32 x=0,y = 0;this->move(x++%600+500,y++%800);
}
 bool event(QEvent *event) override;bool Widget::event(QEvent *event)
{if(event->type()==QEvent::Type::MouseButtonPress)return true;//屏蔽了MouseButtonPress事件return QWidget::event(event);	//把事件交给父类处理
}

发送事件

  • 自定义事件
#include <QWidget>
#include <QMouseEvent>
#include <QEvent>class MyCustomEvent:public QEvent
{
public:MyCustomEvent():QEvent(QEvent::Type::User){info = "自定义事件";}QString getMessage(){return info;}
private:QString info;
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);
protected://鼠标事件void mousePressEvent(QMouseEvent *)override;//自定义事件void customEvent(QEvent *event)override;};Widget::Widget(QWidget *parent): QWidget(parent)
{resize(640,480);
}void Widget::mousePressEvent(QMouseEvent *)
{qInfo()<<"鼠标按下";MyCustomEvent* ce = new MyCustomEvent;qApp->sendEvent(this,ce);
}void Widget::customEvent(QEvent *event)
{if(event->type()==QEvent::User){auto ce = dynamic_cast<MyCustomEvent*>(event);if(!ce)return;qInfo()<<ce->getMessage();}
}
  • sendEvent和postEvent的区别

sendEvent 事件发送后,事件不会被删除,是分配在栈上的
postEvent 事件必须在堆上分配,事件发布后会被删除,事件按优先级降序排列。

2.事件传播机制

事件接受和忽略

QEvent()有accept()和ignore()函数
accept,本组处理该事件,不会被传递
ignore,不处理,交给父处理

事件分发

事件过滤

用事件过滤器实现鼠标拖动无边框窗口案例

#include <QWidget>
#include <QMouseEvent>
#include <QEvent>
#include <QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected://事件过滤处理器bool eventFilter(QObject *watched, QEvent *event)override;
private:QPoint pressPos;#include "Widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{resize(640,480);setWindowFlag(Qt::FramelessWindowHint);//设置无边框installEventFilter(this);//在对象上安装事件过滤器,如果不装,过滤器重写无效
}Widget::~Widget() {}bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(watched==this){if(event->type()==QEvent::MouseButtonPress){auto me=dynamic_cast<QMouseEvent*>(event);pressPos = me->pos();return true;}else if(event->type()==QEvent::MouseMove){auto me=dynamic_cast<QMouseEvent*>(event);move(me->globalPosition().toPoint()-pressPos);//globalPosition是鼠标在全局的位置,pressPos是鼠标相对于窗口左上角的位置,两者一减,就是窗口左上角在全局的位置}elsereturn false;}elsereturn QObject::eventFilter(watched,event);
}};

3.事件和信号的区别

事件信号
与QObject的关系由具体对象进行处理由具体对象主动产生
对程序的影响改写事件处理函数可能导致程序行为发生改变信号是否存在对应的槽函数不会改变程序的行为
两者的联系一般而言,信号在具体的事件处理函数中产生

信号和事件是两个不同层面的东西,发出者不同,作用不同。

http://www.yayakq.cn/news/36121/

相关文章:

  • 便宜建站vps桐城市美好乡村建设办公室网站
  • 网页制作与网站设计可不可以自己做网站
  • 搭建发卡网站要多少钱动漫做3d游戏下载网站有哪些
  • dede的网站地图软装
  • 微页制作网站模板可视化网站制作软件
  • 做网站建设需要网站建设与网页设计的区别
  • 免费高清图片素材网站有哪些seo关键词排名优化技巧
  • 做旅游业务的商业网站18款安全应用软件免费大全
  • 100m的光纤可以做网站吗太原百度seo排名软件
  • 网站建设的公司选择哪家好东莞长安网站设计
  • 大丰网站开发目前最火的自媒体平台
  • 高埗镇网站仿做wordpress建站中英文
  • 甘肃兰州网站建设深圳市佳简几何工业设计有限公司
  • 网站建设需求单湖南大型网站建设公司
  • 凡客诚品还有吗seo搜索引擎优化平台
  • 模仿网站页面违法吗建发公司简介
  • flex 做网站网站手机版跳转 seo
  • 个人企业网站怎么建设叫人开发网站注意事项
  • 天津建设部网站保温跨境进口网站怎么做
  • 关于公司网站改版通知美容行业网站建设多少价格
  • 山东省无障碍网站建设标准网站备案需要准备什么材料
  • 教育门户网站建站discuz网站编码
  • 网站上线 邮件群发模板常州做金属网格公司
  • 网站建设微信文章wordpress用户插件
  • 用wordpress做网站教程公司企业logo设计
  • 防伪网站模板docker免费视频
  • 做家装网站源码18款未成年禁用软件ap入口
  • 很多搜索词网站怎样做wordpress可以添加字段吗
  • 软件公司注册条件免费百度seo引流
  • 太原网站建设公司排名百度联盟广告点击技巧