QT事件注册(捕获事件)

QObject::event(), 
   QObject::installEventFilter(), 
   QWidget::event(), 
   QCoreApplication::sendEvent(), 
   QCoreApplication::postEvent(), 
   QCoreApplication::processEvents().



   普通事件:void customEvent(QEvent* event);

   QT自带的事件处理就不多说了,主要是自定义事件的处理过程。
  
   QEvent:Type中给预留的自定义事件的ID
   User = 1000,                            // first user event id
   MaxUser = 65535                         // last user event id


   在你想使用事件的函数中自建一个事件ID,然后抛出此事件

   比如:
 
   int LivePreviewWidget::playerEventCallback0(XD_PlayerEventType event, void *opaque)
{    
    if(event == XD_PlayerPositionChanged) {
        QEvent *ev = new QEvent(static_cast<QEvent::Type>(QEvent::User + 3));
        qApp->postEvent(static_cast<LivePreviewWidget*>(opaque), ev);
    }else if(event == XD_PlayerVout){        
        QEvent *ev = new QEvent(static_cast<QEvent::Type>(QEvent::User + 4));
        qApp->postEvent(static_cast<LivePreviewWidget*>(opaque), ev);
    }
    return 0;
}

   重载 void customEvent(QEvent* event);捕捉到你想要的事件对它进行相当的处理。
   void LivePreviewWidget::customEvent(QEvent *event)
{

    if(event->type() == static_cast<QEvent::Type>(QEvent::User + 2)) {
        stop();
        showText(tr("DisConnect..."));
        updateTitleText();
        setStatus("Interrupt", true);
        emit statusChanged(this);
        bool isAuto = PlayWidget::status("Auto").toBool();
        if(isAuto)
            _timer->start(1000);
    } else if(event->type() == static_cast<QEvent::Type>(QEvent::User + 3)) {
         setStatus("Interrupt", false);
         setStatus("Playing", true);
         emit statusChanged(this);
         updateTitleText();
         XD_PlayerDetachEvent(_tokenManage[_id]->playToken(), XD_PlayerPositionChanged);
    } else if(event->type() == static_cast<QEvent::Type>(QEvent::User + 4)){        
        updateTitleText();
    }
    QWidget::customEvent(event);
}
   

    其实在应用中最多的还是处理鼠标事件:自定义鼠标事件进行自己想要的处理。
    
    运用起来还普通事件的处理差不多。
     
    首先进行事件注册。
    把你想进行事件处理的UI注册事件处理。
    
    ui->treeView->installEventFilter(this);
    ui->tabWidget->installEventFilter(this);
    installEventFilter(this);


    对事件处理函数进行重载。
    bool eventFilter(QObject *obj, QEvent *event);


  bool CameraSetting::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *event2 = static_cast<QMouseEvent *>(event);
        if(event2->button() == Qt::RightButton)
        {
            hide();
            return true;
        }
        else
        {
            return QObject::eventFilter(obj, event);
        }
    }
    else
    {
        // standard event processing
        return QObject::eventFilter(obj, event);
    }
}


QEvent  常用到的Type:

        None = 0,                               // invalid event
        Timer = 1,                              // timer event
        MouseButtonPress = 2,                   // mouse button pressed
        MouseButtonRelease = 3,                 // mouse button released
        MouseButtonDblClick = 4,                // mouse button double click
        MouseMove = 5,                          // mouse move
        KeyPress = 6,                           // key pressed
        KeyRelease = 7,                         // key released
        FocusIn = 8,                            // keyboard focus received
        FocusOut = 9,                           // keyboard focus lost
        Enter = 10,                             // mouse enters widget
        Leave = 11,                             // mouse leaves widget
        Paint = 12,                             // paint widget
        Move = 13,                              // move widget
        Resize = 14,                            // resize widget
        Create = 15,                            // after widget creation
        Destroy = 16,                           // during widget destruction
        Show = 17,                              // widget is shown
        Hide = 18,                              // widget is hidden
        Close = 19,                             // request to close widget
        Quit = 20,                              // request to quit application
        ParentChange = 21,                      // widget has been reparented
        ParentAboutToChange = 131,              // sent just before the parent         change is done

    
 
QEvent   中 MouseButtonPress 事件又可以进行类行转化 QMouseEvent *event2 = static_cast<QMouseEvent *>(event);


    enum MouseButton {
        NoButton         = 0x00000000,
        LeftButton       = 0x00000001,
        RightButton      = 0x00000002,
        MidButton        = 0x00000004, // ### Qt 5: remove me
        MiddleButton     = MidButton,
        XButton1         = 0x00000008,
        XButton2         = 0x00000010,
        MouseButtonMask  = 0x000000ff
    };


   根据自己想处理的鼠标事件就可以进行相应的操作。
Qt事件过滤器 Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件。 让我们试着设想已经有了一个CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. 现在,我们想用空格键来代替Tab,使焦点在这些QLineEdit间切换。 一个解决的方法是子类化QLineEdit,重新实现keyPressEvent(),并在keyPressEvent()里调用focusNextChild()。像下面这样: void MyLineEdit::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Space) { focusNextChild(); } else { QLineEdit::keyPressEvent(event); } } 但这有一个缺点。如果CustomerInfoDialog里有很多不同的控件(比如QComboBox,QEdit,QSpinBox),我们就必须子类化这么多控件。这是一个烦琐的任务。 一个更好的解决办法是: 让CustomerInfoDialog去管理他的子部件的按键事件,实现要求的行为。我们可以使用事件过滤器。 一个事件过滤器的安装需要下面2个步骤: 1, 调用installEventFilter()注册需要管理的对象。 2,在eventFilter() 里处理需要管理的对象的事件。 一般,推荐在CustomerInfoDialog的构造函数中注册被管理的对象。像下面这样: CustomerInfoDialog::CustomerInfoDialog(QWidget *parent) : QDialog(parent){ ... firstNameEdit->installEventFilter(this); lastNameEdit->installEventFilter(this); cityEdit->installEventFilter(this); phoneNumberEdit->installEventFilter(this); } 一旦,事件管理器被注册,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit的事件将首先发送到eventFilter()。 下面是一个 eventFilter()函数的实现: bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event) { if (target == firstNameEdit || target == lastNameEdit || target == cityEdit || target == phoneNumberEdit) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); if (keyEvent->key() == Qt::Key_Space) { focusNextChild(); return true; } } } return QDialog::eventFilter(target, event); } 在上面的函数中,我们首先检查目标部件是否是 firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit。接着,我们判断事件是否是按键事件。如果事件是按键事件,我们把事件转换为QKeyEvent。接着,我们判断是否按下了空格键,如果是,我们调用focusNextChild(),把焦点传递给下一个控件。然后,返回,true通知Qt,我们已经处理了该事件。 如果返回false的话,Qt继续将该事件发送给目标控件,结果是一个空格被插入到QLineEdit中。 如果目标控件不是 QLineEdit,或者按键不是空格键,我们将把事件传递给基类的eventFilter()函数。 Qt提供5个级别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值