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