Qt實現在QWidget中添加QStatusBar並顯示控件的Status Tip

1.新建QWidget

新建一個QWidget,通過Qt Designer在界面中添加四個按鈕,並取名pushButton_1、pushButton_2、pushButton_3和pushButton_4。

這裏寫圖片描述

2.添加QStatusBar

QStatusBar是QMainWindow中自帶的,在Qt Designer中QMainWindow可以通過右鍵菜單添加或移除QStatusBar,但是QWidget默認中並沒有帶有QStatusBar,需要手動添加,在自定義的QWidget界面類中新建一個QStatusBar類型的指針成員變量m_statusBar。

private:
    QStatusBar *m_statusBar;

並將m_statusBar添加到自定義QWidget類界面的佈局器中。

    m_statusBar = new QStatusBar(this);
    layout()->addWidget(m_statusBar);

3.重寫eventFilter事件過濾函數

這個時候我們就需要重寫QWidget界面類的事件過濾函數eventFilter。

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    // 建議在控件較多的情況下自定義一個控件基類的派生類
    // 並在控件的派生類中去實現eventFilter函數,避免過多的if else判斷

    if (event->type() == QEvent::HoverEnter) {
        QString objName = obj->objectName();
        if (objName == "pushButton_1")
            m_statusBar->showMessage("This is a button A");
        else if (objName == "pushButton_2")
            m_statusBar->showMessage("This is a button B");
        else if (objName == "pushButton_3")
            m_statusBar->showMessage("This is a button C");
        else if (objName == "pushButton_4")
            m_statusBar->showMessage("This is a button D");
        else
            m_statusBar->showMessage("");
    }
    else if (event->type() == QEvent::HoverLeave) {
        m_statusBar->showMessage("");
    }
    else {

    }

    return QWidget::eventFilter(obj, event);
}

4.對控件安裝事件過濾器

在自定義QWidget界面類的構造函數中對界面中的控件安裝事件過濾器,即調用控件的installEventFilter函數,並傳入自定義QWidget界面類的this指針。

    // 這裏同上,避免過多繁瑣的依次調用控件的installEventFilter函數
    // 建議在控件較多的情況下自定義一個控件基類的派生類
    // 在派生類的構造函數中去調用installEventFilter函數

    ui->pushButton_1->installEventFilter(this);
    ui->pushButton_2->installEventFilter(this);
    ui->pushButton_3->installEventFilter(this);
    ui->pushButton_4->installEventFilter(this);

5.Run

調試運行可看到效果,當鼠標指針在按鈕控件中移動時,可以在下方的狀態欄中看到輸出的字符串信息。

這裏寫圖片描述

這裏寫圖片描述

當鼠標指針移除控件外,講不再顯示任何信息。

這裏寫圖片描述

這裏的效果就達到了QMainWindow中的QStatusBar狀態欄的效果了。

6.編程建議

最簡單的方法就是新建一個派生QMainWindow類的自定義界面類,隱藏掉菜單欄和工具欄,控件只需要設置調用setStatusTip設置Status Tip就可以達到這樣的效果。

還有個就是在控件較多的情況下,避免自定義界面類在重寫eventFilter函數時過多的使用if else判斷控件的object name的情況,以及自定義界面類在構造函數中依次調用控件的installEventFilter函數而造成的代碼冗長,建議自定義一個控件基類的派生類,在派生類的構造函數中去調用installEventFilter函數以及派生類中去重寫eventFilter函數。

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