1. 程式人生 > >Qt實現在QWidget中新增QStatusBar並顯示控制元件的Status Tip

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函式。