最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt?事件處理機制的深入理解

 更新時間:2022年04月19日 16:29:39   作者:Mr.codeee  
本文主要介紹了Qt?事件處理機制的深入理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1.Qt中事件的來源,誰接收處理。

Qt中事件的來源有兩個:程序外部和內(nèi)部,多數(shù)情況下來自操作系統(tǒng),可以通過bool QEvent::spontaneous() const函數(shù)來獲知,返回true,事件發(fā)生在應用程序之外(系統(tǒng)事件),否則返回false。

事件由QObject類來接收,是Qt對象模型的核心,所有需要處理的事件類都必須繼承QObject。

2.事件處理順序

首先QCoreApplication::exec()開啟了事件循環(huán),一直到QCoreApplication::exit()被調(diào)用才終止,所以說事件循環(huán)是伴隨著Qt程序的整個運行周期,事件被分發(fā)到事件隊列中,當隊列中有事件時會不停的將事件發(fā)送給QObject對象,隊列為空時就阻塞,以下為處理順序。

  • sendEvent:使用notify()函數(shù)直接將事件發(fā)送給接收者,發(fā)送事件時不會刪除該事件,通常是在棧上面創(chuàng)建事件,它是同步事件。
  • postEvent:將事件添加到事件隊列中,并立即返回;事件必須在堆上分配,因為提交事件隊列將獲得事件的所有權,并在提交后刪除它。在事件發(fā)布后訪問該事件是不安全的,它是異步事件。

示例:

void Widget::on_pushButton_clicked()
{
    QKeyEvent eventPress(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
    QApplication::sendEvent(ui->label, &eventPress);
}
 
void Widget::on_pushButton_2_clicked()
{
    QKeyEvent *eventPress = new QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
    QApplication::postEvent(ui->label, eventPress);
}

點擊上圖中按鈕會發(fā)送QLabel標簽的鍵盤按下tab鍵事件,我自定義了一個WLabel類繼承自QLabel,重寫了event方法。

bool WLabel::event(QEvent *e)
{
 
    if(e->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = (QKeyEvent*)e;
        if(keyEvent->key() == Qt::Key_Tab)
        {
            qDebug()<<"press tab key";
            return ture;
        }
    }
 
    return QLabel::event(e);
}

事件會發(fā)送到WLabel類的event方法中,會打印出下面的結(jié)果。

3.事件過濾器

事件的傳送和處理流程的第一站是事件過濾器eventFilter(),某個對象A可以通過給另一個對象B安裝事件處理器,實現(xiàn)對對象B事件的監(jiān)聽或者攔截功能。我們可以給A取名監(jiān)聽器,B取名接收器。一個對象可以監(jiān)聽多個對象,一個對象也可以被多個事件監(jiān)聽。事件過濾器返回true則表示事件已經(jīng)處理完畢,否則傳遞給下一個監(jiān)聽器或者接收器本身。

void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event);

Qt的事件過濾由以上兩個方法實現(xiàn),首先安裝一個事件過濾器,然后重寫bool eventFilter(QObject *obj, QEvent *event)。

filterObj表示事件篩選器對象,它接收發(fā)送到此QObject對象的所有事件。篩選器可以停止事件,也可以將事件轉(zhuǎn)發(fā)給此QObject對象。事件過濾器filterObj通過它的eventFilter()函數(shù)接收事件。

eventFilter()有返回值。

  • 如果返回true,表示事件過濾,不會發(fā)送到對象本身。
  • 如果返回false,表示事件未過濾,會通過event()方法將事件分發(fā)到對象。
  • 返回給基類進行處理,例:return QObject::eventFilter(obj, event)。

Qt 事件過濾器(秒懂)_Mr.codeee的博客-CSDN博客

4.event方法

當經(jīng)過事件過濾器后,未過濾掉的事件會進入到event方法中,event()函數(shù)主要用于事件的分發(fā)。所以,如果你希望在事件分發(fā)之前做一些操作,就可以在派生類中重寫這個event()函數(shù)。

例:實現(xiàn)一些鼠標進出的打印,鍵盤按鍵一些打印。

bool WLabel::event(QEvent *e)
{
    if(e->type() == QEvent::Enter)
    {
        qDebug()<<"WLabel event :enter";
        return true;
    }
    else if(e->type() == QEvent::Leave)
    {
        qDebug()<<"WLabel event :Leave";
        return true;
    }
    else if(e->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = (QKeyEvent*)e;
        if(keyEvent->key() == Qt::Key_Tab)
        {
            qDebug()<<"press tab key";
            return true;
        }
    }
 
    return QLabel::event(e);
}

上述代碼中event如果事件e被識別并處理,則應返回true,否則交給它的基類QLabel來處理。

5.鼠標進入事件

bool WLabel::event(QEvent *e)
{
    if(e->type() == QEvent::Enter)
    {
        qDebug()<<"WLabel event :enter";
    }
    return QLabel::event(e);
}

上述代碼,

  • 如果事件返回return QLabel::event(e),會將鼠標進入事件分發(fā)到 enterEvent(QEvent *event),會打印下面的語句。
  • 如果打印語句后面 return ture,則不會將事件傳遞到enterEvent中。
void WLabel::enterEvent(QEvent *event)
{
    qDebug()<<"WLabel enterEvent";
}

6.accept(),ignore()

在我們做UI界面時,經(jīng)常會重寫mousePressEvent,wheelEvent等函數(shù),根據(jù)不同情況要對事件event進行特殊處理。

當執(zhí)行event->accept()時,意味著這次的事件已經(jīng)被“我”接受啦,只有我使用。

當執(zhí)行event->ignore()時,意味著這次的事件“我”不要接受他,函數(shù)執(zhí)行完event給我的父窗口,他會需要的。

差別也就是要不要傳遞給父窗口,accept不傳遞,ignore傳遞,注意是父窗口,不是基類。

到此這篇關于Qt 事件處理機制的深入理解的文章就介紹到這了,更多相關Qt 事件處理 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解VS2019 dumpbin查看DLL的導出函數(shù)

    詳解VS2019 dumpbin查看DLL的導出函數(shù)

    這篇文章主要介紹了詳解VS2019 dumpbin查看DLL的導出函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 最新評論

    黎川县| 海原县| 中方县| 咸宁市| 齐齐哈尔市| 武川县| 峡江县| 柯坪县| 葫芦岛市| 子洲县| 长泰县| 沽源县| 易门县| 天门市| 镇坪县| 施甸县| 盐津县| 石首市| 政和县| 黑河市| 呼和浩特市| 鄂温| 东辽县| 石屏县| 离岛区| 大荔县| 福泉市| 北海市| 电白县| 湘潭市| 临漳县| 武平县| 靖远县| 安康市| 建德市| 饶阳县| 项城市| 酒泉市| 曲周县| 永丰县| 吉安市|