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

互联网建设企业网站金融商城快捷申请网站模板下载

互联网建设企业网站,金融商城快捷申请网站模板下载,广西最优秀的品牌网站建设公司,红酒购物网站源码Qt的事件系统 在Qt中#xff0c;事件是对象#xff0c;派生自抽象的QEvent类#xff0c;它表示应用程序内部发生的事情或作为应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理#xff0c;但它们与小部件特别相关。以下描述了在典型应用程序中…Qt的事件系统 在Qt中事件是对象派生自抽象的QEvent类它表示应用程序内部发生的事情或作为应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理但它们与小部件特别相关。以下描述了在典型应用程序中如何传递和处理事件。 需要注意 事件与信号并不相同比如单击某个按钮就会产生鼠标事件QMouseEvent这个事件不是按钮产生的但因为按钮按下了所以会发射clicked()单击信号这个是按钮产生的。如果只关心信号呢就不用考虑鼠标事件但如果要设计一个按钮或者单击产生别的效果就要关心鼠标事件了。这两者是两个层面的东西发出者不同作用也不同。 此外在Qt中任何QObject子类实例都可以接收和处理事件。 QEvent类关系图如下 以下链接是拖放事件介绍和使用示例 【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484 【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006 事件类型 大多数事件类型都有特殊的类特别是QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent和QCloseEvent。每个类都是QEvent的子类并添加特定于事件的函数。例如QResizeEvent添加了size()和oldSize()使小部件能够发现它们的尺寸是如何被改变的。 有些类支持不止一种实际事件类型。QMouseEvent支持鼠标按键、双击、移动和其他相关操作。 每个事件都有一个关联的类型在QEvent:: type中定义这可以用作运行时类型信息的方便来源以快速确定给定事件对象是从哪个子类构造的。 由于程序需要以各种复杂的方式作出反应Qt的事件传递机制是灵活的。 当事件发生时Qt通过构造适当的QEvent子类的实例来创建一个事件对象来表示它并通过调用其event()函数将其传递给QObject的特定实例(或其子类之一)。 此函数不处理事件本身;根据所交付的事件类型它为该特定类型的事件调用事件处理程序并根据该事件是被接受还是被忽略发送响应。 一些事件如QMouseEvent和QKeyEvent来自窗口系统;一些如QTimerEvent来自其他来源;有些来自应用程序本身。 事件的处理 如何处理一个事件呢有以下5中处理事件的方法。 根据QCoreApplication::notify(QObject *receiver, QEvent *event) 发送事件给接收者:receiver-event(事件)。返回从接收者的事件处理程序返回的值。请注意对于发送给任何线程中的任何对象的所有事件都会调用此函数。 对于某些类型的事件(例如鼠标和键事件)如果接收者对事件不感兴趣(即它返回false)事件将被传播到接收者的父对象依此类推直到顶级对象。 处理事件有五种不同的方式;重新实现这个虚函数只是其中之一。下面列出了所有五种方法: 重新实现了paintEvent() mousePressEvent()等。这是最常见、最简单、也是最不强大的方法。重新实现这个函数notify()。这是非常强大的提供完全的控制;但是一次只能有一个子类处于活动状态。在QCoreApplication::instance()上安装事件过滤器。这样的事件过滤器能够处理所有小部件的所有事件因此它与重新实现notify()一样强大;此外可以有多个应用程序全局事件过滤器。全局事件过滤器甚至可以查看禁用小部件的鼠标事件。请注意应用程序事件筛选器仅对位于主线程中的对象调用。重新实现QObject::event()(与QWidget一样)。如果这样做可以按Tab键并且可以在任何特定于小部件的事件过滤器之前看到事件。在对象上安装事件筛选器。这样的事件过滤器获取所有事件包括Tab和ShiftTab键按下事件只要它们不改变焦点小部件。 在实际编程中方法1最常用其次是方法五方法二和方法三虽然功能强大但会减缓事件的传递因此很少用到。 事件过滤 有时对象需要查看(可能还需要拦截)传递给另一个对象的事件。例如对话框通常需要过滤某些小部件的按键;例如修改返回键处理。 QObject::installEventFilter()函数通过设置一个事件过滤器来实现这一点使指定的过滤器对象在其QObject::eventFilter()函数中接收目标对象的事件。事件过滤器在目标对象处理事件之前处理事件允许它根据需要检查和丢弃事件。现有的事件过滤器可以使用QObject::removeEventFilter()函数删除。 当调用过滤器对象的eventFilter()实现时它可以接受或拒绝事件并允许或拒绝事件的进一步处理。如果所有事件过滤器都允许对事件进行进一步处理(通过每个过滤器返回false)则将事件发送到目标对象本身。如果其中一个停止处理(通过返回true)则目标和任何后续事件过滤器根本无法看到该事件。 bool FilterObject::eventFilter(QObject *object, QEvent *event){if (object target event-type() QEvent::KeyPress) {QKeyEvent *keyEvent static_castQKeyEvent *(event);if (keyEvent-key() Qt::Key_Tab) {// Special tab handlingreturn true;} elsereturn false;}return false;}上面的代码显示了拦截发送到特定目标小部件的Tab键按下事件的另一种方法。在这种情况下过滤器处理相关事件并返回true以阻止它们被进一步处理。所有其他事件都被忽略过滤器返回false以允许它们通过安装在目标小部件上的任何其他事件过滤器发送到目标小部件。 通过在QApplication或QCoreApplication对象上安装事件过滤器也可以过滤整个应用程序的所有事件。在特定于对象的筛选器之前调用此类全局事件筛选器。这是非常强大的但它也减慢了整个应用程序中每个事件的事件交付;通常应该使用讨论的其他技术。 事件的传递 每个程序main()函数最后都会调用QApplication() 的exec()方法它会使Qt应用程序进入事件循环这样就可以使应用程序在运行时接收发生的各种事件。一旦有事件发生Qt便会构建一个相应的QEvent子类对象表示之后它会传递相应的QObject对象或子对象。 传递事件的正常方式是调用虚函数。例如QPaintEvent是通过调用QWidget::paintEvent()传递的。这个虚拟函数负责做出适当的反应通常是通过重新绘制小部件。如果在虚函数的实现中没有执行所有必要的工作则可能需要调用基类的实现。 例如下面的代码处理自定义复选框小部件上的鼠标左键点击同时将所有其他按钮点击传递给基类QCheckBox: void MyCheckBox::mousePressEvent(QMouseEvent *event){if (event-button() Qt::LeftButton) {// handle left mouse button here} else {// pass on other buttons to base classQCheckBox::mousePressEvent(event);}}如果想替换基类的函数必须自己实现所有的东西。但是如果只想扩展基类的功能那么可以实现想要的内容并调用基类来获取不想处理的任何情况的默认行为。 有时没有这样一个特定于事件的函数或者特定于事件的函数是不够的。最常见的例子包括按Tab键。通常QWidget会拦截这些键来移动键盘焦点但是一些小部件本身需要Tab键。 这些对象可以重新实现QObject::event()(通用事件处理程序)并在通常的处理之前或之后处理它们的事件或者它们可以完全替换函数。一个非常不寻常的小部件既解释Tab又具有特定于应用程序的自定义事件可能包含以下event()函数: bool MyWidget::event(QEvent *event){if (event-type() QEvent::KeyPress) {QKeyEvent *ke static_castQKeyEvent *(event);if (ke-key() Qt::Key_Tab) {// special tab handling herereturn true;}} else if (event-type() MyCustomEventType) {MyCustomEvent *myEvent static_castMyCustomEvent *(event);// custom event handling herereturn true;}return QWidget::event(event);}注意对于所有未处理的情况仍然调用QWidget::event()并且返回值指示是否处理了事件;true值防止将事件发送给其他对象。 事件传递流程图如下 发送事件 许多应用程序都希望创建和发送它们自己的事件。通过构造合适的事件对象并使用QCoreApplication::sendEvent()和QCoreApplication::postEvent()发送事件可以以与Qt自己的事件循环完全相同的方式发送事件。 sendEvent()立即处理事件。当它返回时事件过滤器和/或对象本身已经处理了事件。对于许多事件类都有一个名为isAccepted()的函数它告诉您事件是被最后调用的处理程序接受还是拒绝。 postEvent()将事件发送到队列中以供以后调度。下次Qt的主事件循环运行时它会调度所有发布的事件并进行一些优化。例如如果有多个调整大小事件它们将被压缩为一个事件。这同样适用于绘制事件:QWidget::update()调用postEvent()这消除了闪烁并通过避免多次重绘提高了速度。 postEvent()也在对象初始化期间使用因为提交的事件通常会在对象初始化完成后很快被分派。在实现小部件时重要的是要认识到事件可以在其生命周期的早期交付因此在其构造函数中一定要在早期初始化成员变量以免它有可能接收到事件。 要创建自定义类型的事件需要定义一个事件号该事件号必须大于QEvent::User并且可能需要创建QEvent的子类以便传递关于自定义事件的特定信息。 事件发生流程示例 以下是一个示例根据打印结果看下其传递的整个流程 新建一个自定义QLineEdit子类 customlineedit.h #ifndef CUSTOMLINEEDIT_H #define CUSTOMLINEEDIT_H#include QLineEditclass CustomLineEdit : public QLineEdit {Q_OBJECT public:explicit CustomLineEdit(QWidget *parent nullptr);signals:public slots:protected:void keyPressEvent(QKeyEvent *e);bool event(QEvent *event); };#endif // CUSTOMLINEEDIT_Hcustomlineedit.cpp #include customlineedit.h#include QKeyEvent #include QDebugCustomLineEdit::CustomLineEdit(QWidget *parent) : QLineEdit(parent) {}void CustomLineEdit::keyPressEvent(QKeyEvent *e) {qDebug().noquote() [ __FILE__ __LINE__ ] 自定义单行编辑框 键盘按下事件;QLineEdit::keyPressEvent(e);e-ignore(); }bool CustomLineEdit::event(QEvent *event) {if(event-type() QEvent::KeyPress){qDebug().noquote() [ __FILE__ __LINE__ ] 自定义单行编辑框 event()函数;}return QLineEdit::event(event); } 主窗口 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include QMainWindownamespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent nullptr);~MainWindow();protected:void keyPressEvent(QKeyEvent *event);bool eventFilter(QObject *watched, QEvent *event);private:Ui::MainWindow *ui; };#endif // MAINWINDOW_H mainwindow.cpp #include mainwindow.h #include ui_mainwindow.h#include QKeyEvent #include QDebugMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-setupUi(this);ui-lineEdit-installEventFilter(this); }MainWindow::~MainWindow() {delete ui; }void MainWindow::keyPressEvent(QKeyEvent *event) {qDebug().noquote() [ __FILE__ __LINE__ ] Mainwindow 键盘按下事件; }bool MainWindow::eventFilter(QObject *watched, QEvent *event) {if(watched ui-lineEdit){if(event-type() QEvent::KeyPress){qDebug().noquote() [ __FILE__ __LINE__ ] Mainwindow 事件过滤器;}}return QMainWindow::eventFilter(watched, event); } 运行输出如下 得出结论 先进入父对象事件过滤器判断对象是不是是判断类型最后返回父类的过滤器事件进入目标对象的event()事件进入目标对象的具体处理事件进入父对象的事件 流程图如下 结论 天没降大任于我照样苦我心智劳我筋骨。
http://www.tj-hxxt.cn/news/132578.html

相关文章:

  • 创业如何进行网站建设wordpress每篇文章怎么加关键词
  • 常熟高端网站建设wordpress 多站
  • html5网站建设源码wordpress没有upload
  • 山西两学一做网站登录网站ui设计师培训
  • 一个旅游网站建设网站搭建推广优化
  • 学校自己做的网站需要买服务器吗注册小规模公司流程以及费用
  • 广东建设网 工程信息网站可以做推广东西的网站
  • 上市公司网站建设方案小程序一个页面多少钱
  • 造作网站模版网站设计手机版为什么那么多背景
  • 网站模板 登陆个人品牌网站建设
  • 常用网站建设技术是什么意思自动生成代码的软件
  • 网站开发需要做什么怎样做网站链接
  • 中小企业网站建设与管理课后答案深圳横岗做网站的
  • 起重机网站怎么做有什么公司是建设网站的吗
  • 绵阳新农网的网站是哪个公司做的石狮网站建设科技
  • ppt超级市场衡水seo外包
  • 网站怎么做必须交钱吗成都中小企业申请网站
  • 电商培训网站国家企业信用信息公示系统辽宁
  • 网站建设 中标九洋建设官方网站
  • 建网站的详细技术国家城乡和建设厅特殊工种网站
  • 网站制作报价明细表阿里云做的网站程序
  • 延吉哪家网站建设公司好任务发布平台
  • 印度做网站设计浙江省建设信息港的网站
  • 焦作网站制作公司漳州优化网站建设
  • html5网站模板下载谷歌网站关键词优化
  • 购物网站开发的背景和意义国外免费推广网站有哪些
  • 网站设计配色方案男女直接做那个视频网站
  • 济南网站建设服务公司个人网站开发总结文档
  • 泰州做网站 泰公网络科技公司常用的搜索引擎网站
  • 教育公司网站模板drupal joomla wordpress