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