QObject有一个eventFilter()函数,用于建立事件过滤器。这个函数的签名如下:virtualboolQObject::eventFilter(QObjectwatched,QEventevent); 事件过滤器的原理:它会检查接收到的事件。如果这个事件是我们感兴趣的类型,就进行我们自己的处理;如果不是,就继续转发。这个函数返回一个bool类型,如果你想将参数event过滤出来,比如,不想让它继续转发,就返回true,否则返回false。 举例:这里使用eventFilter事件过滤器来捕获鼠标对ui中按键的一些操作,比如放在上面,离开uibtnrecordinstallEventFilter(this);uipushButtonplayerinstallEventFilter(this);uipushButtondeleteinstallEventFilter(this);uipushButtonallCheckinstallEventFilter(this);uitableWidget2viewport()installEventFilter(this);注册事件过滤器 eventFilter()函数相当于创建了过滤器,然后我们需要安装这个过滤器。上面就是给每个按键以及tablewidget都装上事件过滤器 类一定要继承于QOBJECT,并且在类的。h文件中说明这个函数booleventFilter(QObjectobj,QEventev);然后在。cpp文件实现该函数boolrecord::eventFilter(QObjectobj,QEventev){if(objuitableWidget2viewport()){if(evtype()QEvent::MouseButtonRelease){QListQTableWidgetItemitems1uitableWidget2selectedItems();if(!items1。isEmpty()){intcountitems1。count();获取该行的成员数introwuitableWidget2row(items1。at(0));获取该行的行号QStringcalllogrecordtableWidget2row:QString::number(row);logfilesave(calllog);uilineEditsetText(SchNameList。at(row));uitableWidget2hide();returntrue;}}}if(objuibtnrecord)按键的事件{if(evtype()QEvent::HoverEnter)鼠标放在按键上面{setbtnState(BTNRECORDBTN,BTNRECORDSTATEMOUSEOVER);mrecordBtnUartStategetbtnState(BTNRECORDBTN);returntrue;}elseif(evtype()QEvent::HoverLeave)鼠标离开按键{setbtnState(BTNRECORDBTN,mrecordBtnUartState);returntrue;}}returnfalse;}设置按键的状态,比如设置按键的背景voidrecord::setbtnState(EBTNRECORDNAMEbuttonName,EBTNRECORDSTATEbuttonState){switch(buttonName){caseBTNRECORDBTN:switch(buttonState){caseBTNRECORDSTATENORMAL:uibtnrecordresize(NAVIBTNNORMALW,NAVIBTNNORMALH);uibtnrecordmove(NAVIBTNNORMALX,NAVIBTNNORMALY);uibtnrecordsetStyleSheet(QPushButton{backgroundimage:url(:publicnormalPconfmenu。png);});break;caseBTNRECORDSTATEMOUSEOVER:uibtnrecordresize(NAVIBTNNORMALW,NAVIBTNNORMALH);uibtnrecordmove(NAVIBTNNORMALX,NAVIBTNNORMALY);uibtnrecordsetStyleSheet(QPushButton{backgroundimage:url(:publicmouseoverPconfmenu。png);});break;caseBTNRECORDSTATESELECTED:uibtnrecordresize(NAVIBTNSELECTEDW,NAVIBTNSELECTEDH);uibtnrecordmove(NAVIBTNSELECTEDX,NAVIBTNSELECTEDY);uibtnrecordsetStyleSheet(QPushButton{backgroundimage:url(:publicselectedPconfmenu。png);});}break;}} 实际上任何子类都可以使用事件过滤器,不管是不是组件还是类elseif(objcallnum){if(evtype()QEvent::MouseButtonRelease){QMouseEventestaticcastQMouseEvent(ev);intmouseReleasexex();intmouseReleaseyey();intcurrrntpos0,lastpos;for(intk0;k16;k)检索呼叫列表是否有占用当前窗口{if((mouseReleasex(callnumbutton〔k〕pos()。x()))(mouseReleasex((callnumbutton〔k〕pos()。x())(callnumbutton〔k〕size()。width())))){if((mouseReleasey(callnumbutton〔k〕pos()。y()))(mouseReleasey((callnumbutton〔k〕pos()。y())(callnumbutton〔k〕size()。height())))){for(intj0;jUUInfo。size();j){if(itemlevel3〔j〕text(0)callnumbutton〔k〕funcname){uitreeWidgetsetCurrentItem(itemlevel3〔j〕);}}if(CurWindow。CurSelectWindowk)returntrue;for(ints0;s16;s){if(videopos〔s〕k)currrntposs;if(videopos〔s〕CurWindow。CurSelectWindow)lastposs;}videopos〔lastpos〕k;videopos〔currrntpos〕CurWindow。CurSelectWindow;CurSelectWindowchange(lastpos);returntrue;}}}returntrue;}} 上面的例子就是一个子窗口的事件过滤器,在事件过滤器中获取鼠标点击的位置 如果事件过滤器中的事件正好是我们想要捕获的就返回true,这样事件就不会转发了,如果事件不是我们想要的,一定要返回false,否则影响其他组件,比如我们这里想要tableWidget2和btnrecord的事件,如果不返回false,每次不管哪个组件进入事件,后续都没法处理,因为事件没有了转发,其他组件无法处理事件了 eventFilter()函数是QObject的一个成员函数,因此,任意QObject都可以作为事件过滤器(问题在于,如果你没有重写eventFilter()函数,这个事件过滤器是没有任何作用的,因为默认什么都不会过滤)。已经存在的过滤器则可以通过QObject::removeEventFilter()函数移除。 事件过滤器和被安装过滤器的组件必须在同一线程,否则,过滤器将不起作用。 注意,如果你在事件过滤器中delete了某个接收组件,务必将函数返回值设为true。否则,Qt还是会将事件分发给这个接收组件,从而导致程序崩溃。 只要组件注册了事件过滤器,无论任何操作都会首先进入事件过滤器,就看最后返回的true还是false,返回true不做其他处理,返回false做其他处理。 【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】 点击这里:链接