• <del id="a8uas"></del>
    • 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

      400-811-9990
      手機站
      千鋒教育

      千鋒學習站 | 隨時隨地免費學

      千鋒教育

      掃一掃進入千鋒手機站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學習站小程序
      隨時隨地免費學習課程

      上海
      • 北京
      • 鄭州
      • 武漢
      • 成都
      • 西安
      • 沈陽
      • 廣州
      • 南京
      • 深圳
      • 大連
      • 青島
      • 杭州
      • 重慶
      當前位置:合肥千鋒IT培訓  >  技術(shù)干貨  >  QT使用教程之事件

      QT使用教程之事件

      來源:千鋒教育
      發(fā)布人:qyf
      時間: 2023-02-13 17:35:57

        1、事件概述

        事件經(jīng)過以下:事件派發(fā)----》事件過濾器----》事件分發(fā)---》事件處理階段。

        事件:系統(tǒng)或者 Qt 本身在不同的時刻發(fā)出的。

        事件循環(huán)開始:exec()函數(shù)。

        2、常見事件函數(shù)

        幫助文檔:

      圖片 1

      圖片 2

      圖片 3

        3、重寫窗口關(guān)閉、窗口重新設(shè)置大小事件

        步驟1:新增一個類繼承于QWidget(新建工程)

        步驟2:子類.h聲明重寫的事件函數(shù)

        protected:

        void closeEvent(QCloseEvent *event);

        void resizeEvent(QResizeEvent *event);

        步驟3:子類的.cpp去實現(xiàn)事件函數(shù)

        void Widget::closeEvent(QCloseEvent *event)

        {

        int ret = QMessageBox::question(this,"提示","您確定要關(guān)閉窗口嗎?");

        if(ret == QMessageBox::Yes)

        {

        event->accept();

        }

        else{

        event->ignore();

        }

        }

        void Widget::resizeEvent(QResizeEvent *event)

        {

        qDebug()<<"oldsize="<oldSize();

        qDebug()<<"newsize="<size();

        }

        4、鼠標按下、釋放,移動事件

        步驟1:新建label類繼承QLabel(新建工程,ui繪制label,新增c++類繼承QWiget,代碼修改繼承QLabel,ui繪制label提升新創(chuàng)建label類)

        步驟2:查看幫助文檔

      圖片 4

        步驟3:在mylabel.h聲明事件函數(shù)

        protected:

        void mousePressEvent(QMouseEvent *ev);

        void mouseReleaseEvent(QMouseEvent *ev);

        void mouseMoveEvent(QMouseEvent *ev);

        步驟4:在mylabel.cpp實現(xiàn)事件函數(shù)

        #include

        #include

        MyLabel::MyLabel(QWidget *parent) : QLabel(parent)

        {

        this->setMouseTracking(true);//設(shè)置追蹤模式

        }

        void MyLabel::mousePressEvent(QMouseEvent *ev)

        {

        if( ev->button() == Qt::LeftButton){

        qDebug()<<"鼠標左鍵按下了";

        }

        else if( ev->button() == Qt::RightButton)

        {

        qDebug()<<"鼠標右鍵按下了";

        }

        else{

        qDebug()<<"鼠標其他按下了";

        }

        }

        void MyLabel::mouseReleaseEvent(QMouseEvent *ev)

        {

        qDebug()<<"在標簽上的鼠標釋放了";

        }

        void MyLabel::mouseMoveEvent(QMouseEvent *ev)

        {

        qDebug()<<"鼠標移動"<x()<<","<y();

        QString str;

        str.sprintf("

          str.sprintf("<center><h1>(%d ,%d)</h1></center>",ev->x(),ev->y());

        this->setText(str);

        }

        5、重寫事件分發(fā)函數(shù)(了解)

        案例:鍵盤事件:監(jiān)聽tab按鍵

        步驟1:.h聲明event

        bool event(QEvent *event);

        步驟2:.cpp實現(xiàn)event

        bool Widget::event(QEvent *event)

        {

        //判斷事件類型(鍵盤事件)

        if(event->type() == QEvent::KeyPress){

        //將QEvent類型的event轉(zhuǎn)換類型為QKeyEvent

        QKeyEvent *keyEvent = static_cast(event);

        if(keyEvent->key() == Qt::Key_Tab){

        qDebug()<<"TAB被按下";

        return true;

        }

        }

        return QWidget::event(event);

        }

        注意:

        1、事件分發(fā)函數(shù)的返回值bool。

        2、我們處理過自己感興趣的事件之后,可以直接返回 true,表示我們已經(jīng)對此事件進行了處理;對于其它我們不關(guān)心的事件,則需要調(diào)用父類的event()函數(shù)繼續(xù)轉(zhuǎn)發(fā),否則這個組件就只能處理我們定義的事件了。

        6、事件過濾器(了解)

        使用:重寫

        步驟1:聲明

        virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );

        步驟2:實現(xiàn)(先判斷是否是要過濾事件的組件,如果是是要過濾事件的組件,再去判斷事件是否過濾,如果過濾返回true,如果不過濾返回false;

        如果不是要過濾事件的組件,返回父類的事件過濾函數(shù))

        bool MainWindow::eventFilter(QObject *obj, QEvent *event)

        {

        if (obj == textEdit) {

        if (event->type() == QEvent::KeyPress) {

        QKeyEvent *keyEvent = static_cast(event);

        qDebug() << "Ate key press" << keyEvent->key();

        return true;

        } else {

        return false;

        }

        } else {

        // pass the event on to the parent class

        return QMainWindow::eventFilter(obj, event);

        }

        }

        步驟3:安裝

        void QObject::installEventFilter ( QObject * filterObj )

        步驟4:移除

        void QObject::removeEventFilter( QObject * filterObj )

        7、事件總結(jié)

        事件處理有以下四個過程:

        事件處理:重寫鼠標按下事件、鼠標釋放事件,這個是最簡單的形式及功能。

        事件分發(fā):重新event函數(shù)。

        事件過濾:重寫eventFilter,過濾特定對象的事件,或者所有對象的所有事件(QCoreApplication::instance)。

        事件派發(fā):(QCoreApplication::notify).

      圖片 5

      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

      猜你喜歡LIKE

      unity快捷鍵大全

      2023-08-28

      unity射線檢測多個物體

      2023-08-28

      unity富文本字體大小

      2023-08-28

      最新文章NEW

      unity性能優(yōu)化指標

      2023-08-28

      unity開發(fā)常用框架

      2023-08-28

      unity玻璃材質(zhì)球

      2023-08-28

      相關(guān)推薦HOT

      更多>>

      快速通道 更多>>

      最新開班信息 更多>>

      網(wǎng)友熱搜 更多>>