Qt學習(5)Qt中的事件

1 Qt中的事件
1.1 鼠標事件
1.2 鼠標進入事件 enterEvent
1.3 鼠標離開事件 leaveEvent
1.4 鼠標按下 mousePressEvent ( QMouseEvent *ev)
1.5 鼠標釋放 mouseReleaseEvent
1.6 鼠標移動 mouseMoveEvent
1.7 ev->x() x座標 ev->y() y座標
1.8 ev->button() 可以判斷所有按鍵 Qt::LeftButton Qt::RightButton
1.9 ev->buttons()判斷組合按鍵 判斷move時候的左右鍵 結合 & 操作符
1.10 格式化字符串 QString( “ %1 %2 ” ).arg( 111 ).arg(222)
1.11 設置鼠標追蹤 setMouseTracking(true);

2 定時器1
2.1 利用事件 void timerEvent ( QTimerEvent * ev)
2.2 啓動定時器 startTimer( 1000) 毫秒單位
2.3 timerEvent 的返回值是定時器的唯一標示 可以和ev->timerId 做比較

3 定時器2
3.1 利用定時器類 QTimer
3.2 創建定時器對象 QTimer * timer = new QTimer(this)
3.3 啓動定時器 timer->start(毫秒)
3.4 每隔一定毫秒,發送信號 timeout ,進行監聽
3.5 暫停 timer->stop

4 event事件
4.1 用途:用於事件的分發
4.2 也可以做攔截操作,不建議
4.3 bool event( QEvent * e);
4.4 返回值 如果是true 代表用戶處理這個事件,不向下分發了
4.5 e->type() == 鼠標按下 …

bool myLabel::event(QEvent *e)
{
    //如果是鼠標按下  在event事件分發中做攔截操作
    if(e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *ev = static_cast<QMouseEvent *>(e);
        QString str = QString("Event函數中::鼠標按下了 x=%1  y=%2  globalX=%3  globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;

        return true;
        //return true代表用戶自己處理這個事件,不向下分發
    }
    //其他事件  交給父類處理 默認處理
    return QLabel::event(e);
}

5 事件過濾器
5.1 在程序將事件分發到事件分發器前,可以利用過濾器做攔截
5.2 步驟
5.2.1 1、給控件安裝事件過濾器
5.2.2 2、重寫 eventFilter函數 (obj , ev)

    //步驟1 給label1 安裝事件過濾器
    ui->label->installEventFilter(this);


//步驟2 重寫 eventfilter事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->label)
    {
        if(event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *ev = static_cast<QMouseEvent *>(event);
            QString str = QString("事件過濾器中::鼠標按下了 x=%1  y=%2  globalX=%3  globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug()<<str;

            return true;
        }
        //其他默認處理
        return QWidget::eventFilter(watched,event);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章