【Qt开发笔记】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函数。

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值