QT鼠标响应

QT鼠标响应(移动到按钮上按钮有响应)  

http://www.tonkv.com/blog/read.php?265#entrymore(原文地址)

在一些华丽的界面程序中,大多数鼠标经过某些组件时,组件就会有些动画效果事件。当然我们可以通过判断组件的hover事 件,但如果只是动画效果,我们倒是可以只设置按钮三种状态不同的动画图片也是简单的。如果需要鼠标经过某些组件时,组件就自动反应并且做一些事情。就要通 过事件完成了。在Qt中有mouseMoveEvent()事件,但它必须在按下去才会有事件的产生。因此我们需要激活组件的鼠标追踪属性;

    setMouseTracking(true);  //这是激活整个窗体的鼠标追踪

    Qtbtn_1->setMouseTracking(true); //进入某个按钮时,鼠标追踪属性失效,因此我们也需要激活该按钮的鼠标追踪功能

    Qtbtn_2->setMouseTracking(true);

     然后再实现mouseMoveEvent()事件

void MenuForm::mouseMoveEvent(QMouseEvent *e)

{

    e->accept();

    if(enterBtn(e->pos(),Qtbtn_1))

        Qlab_context->setText("这是第一个按钮");

    if(enterBtn(e->pos(),Qtbtn_2))

        Qlab_context->setText("这是第二个按钮");

}

    这里我使用另一个函数来完成判断鼠标是否在一个按钮区域内,如果在区域内只返回真,否则返回假

bool MenuForm::enterBtn(QPoint pp, QToolButton *btn)

{

    int height = btn->height();

    int width = btn->width();

    QPoint btnMinPos = btn->pos();

    QPoint btnMaxPos = btn->pos();

    btnMaxPos.setX(btn->pos().x()+width);

    btnMaxPos.setY(btn->pos().y()+height);

    if(pp.x() >= btnMinPos.x() && pp.y() >= btnMinPos.y()

        && pp.x() <= btnMaxPos.x() && pp.y() <= btnMaxPos.y())

        return true;

    else

        return false;

}


http://www.tonkv.com/blog/read.php?266#entrymore(原文地址)
“雁过留痕”的鼠标移动事件(续)
在 上面一篇文章中,我们介绍一种实际是通过鼠标当前坐标位置是否进入按钮坐标区域进行判断,这样实现起来多少有点麻烦。所以我们需要更方便简介的办法。很巧 合的是Qt为我们提供了这样的功能,那就事件过滤器【eventFilter()】。这是一个非常强大的功能。下面的例子中有九个按钮,当鼠标移动到每个 按钮上时,该按钮就会发生你所指定的反应。这里例子仅仅只是显示标签文字而已,当然你们也可以进行更复杂的操作。

首先我们要做的就是为每个按钮注册监视对象【installEventFilter()】。

void MenuForm::init()
{
    //为按钮注册事件
    Qtbtn_1->installEventFilter(this);
    Qtbtn_2->installEventFilter(this);
    Qtbtn_3->installEventFilter(this);
    Qtbtn_4->installEventFilter(this);
    Qtbtn_5->installEventFilter(this);

    Qtbtn_6->installEventFilter(this);
    Qtbtn_7->installEventFilter(this);
    Qtbtn_8->installEventFilter(this);
    Qtbtn_9->installEventFilter(this);
}

现在程序可以监视你注册后的对象了,然后我们要做的就是在监视对象的eventFiilter()函数中来处理目标对象事件。

bool MenuForm::eventFilter(QObject *target, QEvent *e)
{
    if(target == Qtbtn_1)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第一个按钮");
    }
    if(target == Qtbtn_2)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第二个按钮");
    }
    if(target == Qtbtn_3)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第三个按钮");
    }
    if(target == Qtbtn_4)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第四个按钮");
    }
    if(target == Qtbtn_5)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第五个按钮");
    }
    if(target == Qtbtn_6)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第六个按钮");
    }
    if(target == Qtbtn_7)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第七个按钮");
    }
    if(target == Qtbtn_8)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第八个按钮");
    }
    if(target == Qtbtn_9)
    {
        if(e->type() == QEvent::Enter)
            Qlab_context->setText("这是第九个按钮");
    }
    return QDialog::eventFilter(target, e);
}

这样的功能完成了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值