1. 程式人生 > >控制元件巢狀中的QT滑鼠事件處理機制

控制元件巢狀中的QT滑鼠事件處理機制

想實現在層層佈局的控制元件中,對最外層的QLabel上的滑鼠事件實現tracking,即觸發mouseMoveEvent的時候,不需要一直按著

前提:自定義控制元件,繼承QLabel重寫滑鼠事件相應的方法
可參考:https://wiki.qt.io/Clickable_QLabel

否則label根本接受不到滑鼠事件,談什麼label->setMouseTracking(true);而且,像label本身就在最外層的,也不需要層層都setMouseTracking(true);


好了,由於此前不知,滑鼠事件都寫好在MainWindow下重寫mouseMoveEvent下了,遷移到在子控制元件label下處理,改動太大,於是想

  1. void Label::mousePressEvent(QMouseEvent *ev)裡通過parent指標((MainWindow *)this->parent())->mousePressEvent(ev);呼叫void MainWindow::mousePressEvent(QMouseEvent *ev),發現即使型別轉換能執行,實際上並沒有呼叫成功
  2. 通過由外向內的setAttribute(Qt::WA_TransparentForMouseEvents);
tab_label->setAttribute(Qt::WA_TransparentForMouseEvents
); tab->setAttribute(Qt::WA_TransparentForMouseEvents); ui->tabWidget->setAttribute(Qt::WA_TransparentForMouseEvents); ui->centralWidget->setAttribute(Qt::WA_TransparentForMouseEvents);

能基本實現,但是也讓tab下的其他控制元件的滑鼠事件失效了
3. 最後通過QT的事件過濾器實現
這裡寫圖片描述
具體可參考https://blog.csdn.net/chenlong12580/article/details/7724010


就是讓子控制元件label加一句label->installEventFilter(this);//註冊事件監聽器
MainWindow實現監聽

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==cur->tab_label){
        QMouseEvent * mouseEvent=static_cast<QMouseEvent*>(event);
        if(event->type()==QEvent::MouseButtonPress){
            mousePressEvent(mouseEvent);
        }else if(event->type()==QEvent::MouseMove){
            mouseMoveEvent(mouseEvent);
        }
        //return true;
    }
    return QMainWindow::eventFilter(watched, event);
}

由於我直接把label上所有的event,上來就直接轉成滑鼠事件,不註釋return true的話,滑鼠事件是理想了,圖片載入不出來,不知道是不是因為載入圖片也會被監聽到什麼event