日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT事件事件之一:Qt中的事件处理与传递

發(fā)布時(shí)間:2023/11/30 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT事件事件之一:Qt中的事件处理与传递 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

QT事件事件之一:Qt中的事件處理與傳遞

  • 前言
  • 一、簡介
  • 二、QT中的事件
  • 三、事件的實(shí)現(xiàn)的方法


前言

在QT中,事件是我們很常用的東西,以下是我用事件時(shí)總結(jié)和做法


一、簡介

在QT中,事件作為一個(gè)對(duì)象,繼承QEvent類,常見的有鍵盤事件QKeyEvent、鼠標(biāo)事件QMouseEvent和定時(shí)器事件QTimerEvent等,與QEvent類的繼承關(guān)系如圖所示。

二、QT中的事件

事件是對(duì)各種應(yīng)用程序需要知道的由應(yīng)用程序內(nèi)部或者外部產(chǎn)生的事件的通稱。在QT中使用一個(gè)對(duì)象來表示一個(gè)事件,繼承自QEvent類。事件與信號(hào)是不同的,他們的區(qū)別是
信號(hào)
1.信號(hào)不是事件,信號(hào)的本質(zhì)是回調(diào)函數(shù),在一個(gè)線程中可看作是同步操作
2.同時(shí)信號(hào)的發(fā)出者是對(duì)象,信號(hào)不會(huì)循環(huán),接收者會(huì)立即收到
3.信號(hào)的返回值無意義
事件
1.事件一般是通過postEvent()函數(shù)進(jìn)入到主循環(huán)隊(duì)列中,是異步操作
2.事件的發(fā)出者一般是窗口系統(tǒng),少數(shù)來自系統(tǒng)的內(nèi)部
3.事件回調(diào)時(shí)是以當(dāng)前窗口開始,一級(jí)一級(jí)向上派發(fā),直到有一個(gè)窗口返回true,截?cái)嗍录幚碇行?br /> 4.事件根據(jù)返回值判斷事件是否被處理
注意:

1、信號(hào)有具體的對(duì)象發(fā)出,然后馬上交給connect()函數(shù)連接的槽進(jìn)行處理,而對(duì)于事件,Qt使用一個(gè)隊(duì)列事件對(duì)所有的事件進(jìn)行維護(hù),當(dāng)新的事件產(chǎn)生時(shí),會(huì)被追加到事件隊(duì)列的尾部。

2、信號(hào)一旦發(fā)出,槽函數(shù)一定會(huì)執(zhí)行,事件可以用過濾器過濾.

3、信號(hào)與槽中,發(fā)送者所在的線程是無關(guān)緊要的。在自動(dòng)連接情況下,Qt需要查看信號(hào)發(fā)出的線程是不是和信號(hào)接收者的線程一致,來決定連接的類型!

三、事件的實(shí)現(xiàn)的方法

代碼如下(示例):

#ifndef MYLABEL_H #define MYLABEL_H#include <QWidget> #include <QLabel> #include <QDebug> class mylabel : public QLabel {Q_OBJECT public:explicit mylabel(QWidget *parent = 0);//鼠標(biāo)進(jìn)入void enterEvent(QEvent *event);//鼠標(biāo)離開void leaveEvent(QEvent *event);signals:public slots: };#endif // MYLABEL_H #include "mylabel.h"mylabel::mylabel(QWidget *parent) : QLabel(parent) {}void mylabel::leaveEvent(QEvent *event) {qDebug()<<"鼠標(biāo)離開了"; }void mylabel::enterEvent(QEvent *event) {qDebug()<<"鼠標(biāo)進(jìn)入了"; }

這是我自定義的mylabel類來實(shí)現(xiàn)事件。此時(shí)我們只是實(shí)現(xiàn)了事件的功能,但是我們卻沒有對(duì)綁定相關(guān)的控件來實(shí)現(xiàn)這。第一種方法是我們?cè)趗i界面中,畫一個(gè)label,然后將提升為mylabel自定義類。


第二種方法,我們使用的是事件過濾器的形式來完成
代碼如下(示例):

#ifndef MYLABEL_H #define MYLABEL_H#include <QWidget> #include <QLabel> #include <QDebug> #include <QPushButton> #include <QEvent> class mylabel : public QLabel {Q_OBJECT public:QLabel * label1;QPushButton * btn_1;explicit mylabel(QWidget *parent = 0);//事件過濾器bool eventFilter(QObject *watched, QEvent *event);signals:public slots: };#endif // MYLABEL_H

代碼如下(示例):

#include "mylabel.h"mylabel::mylabel(QWidget *parent) : QLabel(parent) {this->resize(300,500);this->setText("標(biāo)簽");btn_1=new QPushButton("登錄",this);btn_1->installEventFilter(this);}bool mylabel::eventFilter(QObject *watched, QEvent *event) {if(watched==btn_1 && event->type()==QEvent::MouseButtonPress){qDebug()<<"找到btn_1";} }

總結(jié)

以上是生活随笔為你收集整理的QT事件事件之一:Qt中的事件处理与传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。