用KEGG网站做通路富集分析,定制高端网站的公司,怎样加强企业网站建设,sem即事件和信号的区别在于#xff0c;事件通常是由窗口系统或应用程序产生的#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组… 事件和信号的区别在于事件通常是由窗口系统或应用程序产生的信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组件作为交互操作编程的时候我们通常选择合适的信号为该信号编写槽函数。但是Qt的界面组件只将少数事件进行封装成了信号对于某些事件可能缺少对应的信号例如QLabel的信号中就没有与双击鼠标对应的信号 在这种情况下我们可以从QLabel继承定义一个新的标签类通过自定义信号和事件处理使新的标签类具有处理鼠标双击事件的信号。 函数event()的作用 应用程序派发给界面组件的事件首先会由其函数event()处理如果函数event()不做任何处理组件就会自动调用QWidget中与事件类型对应的默认事件处理函数从QWidget派生的界面组件一般不需要重新实现函数event()如果对某种事件进行处理可以重新实现其对应的事件处理函数。 QWidget类针对一些典型事件编写了事件处理函数但是某些类型的事件没有对应的事件处理函数例如对于QEvent::HoverEnter和QEvent::HoverLeave类型的事件QWidget类中就没有对应的事件处理函数这种情况下如果要对QEvent::HoveEnter和QEvent::HoveLeave类型的事件进行处理就需要自定义一个类重新实现函数event(),判断事件类型针对QEvent::HoveEnter和QEvent::HoveLeave类型的事件进行对应的处理。 注意TMyLabel中的构造函数我是改变了其中参数的因为使用创建C类向导自动生成的TMyLabel的构造函数是没有任何参数的这样是不对的因为界面组件必须要有一个父容器组件
注意在构造函数中我们将TMyLabel的Qt::WA_Hover属性设置为true(默认值是false)。这样鼠标光标移入和移出才会分别产生QEvent::HoveEnter和QEvent::HoveLeave类型的事件。 事件过滤器 一个界面组件如果要对事件进行处理需要从父类继承定义一个新类在新类里编写程序直接处理事件或者将事件转换成信号。 如果不想定义一个新的类可以用事件过滤器对界面组件的事件进行处理。事件过滤器是QObject提供的一种处理事件的方法它可以将一个对象的事件委托给另一个对象来监听并处理。 事件过滤器工作原理 QObject提供了一种处理事件的方法事件过滤器。它可以将一个对象的事件委托给另一个对象来监视并处理。例如一个窗口可以作为其他界面上的QLabel组件的事件过滤器派发给QLabel组件的事件由窗口去处理这样就不需要为了处理某种事件而新定义一个标签类。 要实现事件过滤器功能需要完成两项操作。 1被监视对象使用函数installEventFilter()将自己注册给监视对象监视对象就是事件过滤器。 2监视对象重新实现eventFilter()函数对监视到的事件进行处理。 installEventFilter()和eventFilter()都是QObject类定义的公有函数函数installEventFilter()的原型定义如下 void QObject::installEventFilter(QObject* filterObj) 被监视的对象调用installEventFilter()将对象filterObj设置为自己的事件过滤器。 函数eventFilter()的原型定义如下
bool QObjecteventFilter(QObject* watched , QEvent* event) 作为事件过滤器的监视对象需要重新实现eventFilter()参数watched 是被监视的对象event是产生的事件。这个函数有一个返回值如果返回true事件就不会再传播给其他对象事件处理结束如果返回false事件会继续传播给事件接受者做进一步处理。 注意eventFilter()函数结尾不能直接返回true如果返回true的话事件过滤器拦截的事件不会继续传播给被监视对象而在这个类的eventFilter()函数中我们只处理了被监视对象的少数几个事件件例如QEvent::Paint类型的事件就没有处理程序运行时界面上根本就不显示标签的文字。
注意 QEvent::Enter和QEventLeave两个类型的事件它们与QEvent::HoverEnter和QEvent::HoverLeave类型的事件功能相似只是使用Hover事件时需要将组件的mouseTracking属性设置为true而使用QEvent::Enter和QEventLeave两个类型的事件时无需设置这个属性