zoukankan      html  css  js  c++  java
  • qt实现类似QQ伸缩窗口--鼠标事件应用

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://blog.csdn.net/hiwubihe/article/details/38678305,qq:1269122125。

    上一章节讲了qt鼠标事件实现,获取鼠标参数的方法。这一讲主要讲怎么应用上讲的鼠标事件实现一个小功能。
     qq好友对话框右侧 未展开时如图:


    鼠标移动到 “隐藏侧边”处单击可以隐藏侧边,隐藏后效果如图:
     

    实现的范例效果如下

    1.一般情况
     

    2.鼠标移动到中间分割线中间区域时,效果

     

    3.单击红色按钮后,效果


    4.鼠标移动到边界,效果

     

    下面讲解实现过程:
    一般情况在QT中,这种伸缩窗体的实现有两种方法:一种是是直接用QSplitter分割器实现;另一种直接用布局管理器自己实现。本节用的是第二种方法实现的。布局管理器有一个layoutSizeConstraint属性,通过设置这个属性可以实现伸展功能。这里用默认属性即可。
    1.整个结构分为左侧窗体和右侧窗体,因为左右窗体要用到鼠标事件,所以首先定义一个自定义窗体部件,继承于QFrame,重写mouseMoveEvent事件,用于捕捉鼠标。MouseBase.h 文件如下:

     
    #ifndef MOUSEBASE_H
    #define MOUSEBASE_H
     
    #include <QtGui>
    #include <QMouseEvent>
    class CMouseBase : public QFrame
    {
        Q_OBJECT
    public:
        CMouseBase(QWidget *parent = 0);
        ~CMouseBase();
    signals:
        void signalsMousePosition(int ix,int iy);
    protected :
        void mouseMoveEvent ( QMouseEvent  * e );
    };
    #endif
    2.实现文件如下:MouseBase.cpp
     
    #include "MouseBase.h"
     
    CMouseBase::CMouseBase (QWidget *parent) : QFrame(parent)
    {  
        this->setMouseTracking ( true);   //设置此窗体是否跟踪鼠标
    }
    CMouseBase::~CMouseBase ()
    {
    }
     
    void CMouseBase::mouseMoveEvent ( QMouseEvent  * e )
    {
        emit signalsMousePosition(e->x(),e->y());
       
    }
     
    3.新建UI文件,ui中包括 主窗体,左窗体和右窗体类型为CMouseBase,按钮。再把左右窗体放入网格布局管理器中。
    4.绑定左右窗体的鼠标信号
            connect(ui.LeftFrame,SIGNAL(signalsMousePosition(int,int)),this,SLOT(slotsMousePosition(int,int)));
    connect(ui.RightFrame,SIGNAL(signalsMousePosition(int,int)),this,SLOT(slotsMousePosition(int,int))); 
    5.信号处理函数如下:
     
    void test::slotsMousePosition(int ix,int iy)
    {
        CMouseBase *pWidow = qobject_cast< CMouseBase *>(sender());
        
        if(pWidow == ui.RightFrame)
        {
            //这里传入的坐标是当前对象的相对坐标
     
            int iYTop=(ui.RightFrame->height()- ui.pushButton->height())/2;
            int iYBottom=(ui.RightFrame->height()+ ui.pushButton->height())/2;
            if((ix<10) &&(ix>0)&&(iy>iYTop)&&(iy<iYBottom))
            {
                ui.pushButton->show();
            }
            else
            {
                ui.pushButton->hide();
            } 
        }
        else
        {
            ui.pushButton->hide();
        }
    }
     
     
    qt版本:4.8.6,开发环境:vs2010 


     

    欢迎技术交流沟通,转载请注明出处并保持作品的完整性。 作者:程序人生 qq1269122125
  • 相关阅读:
    507.Perfect Number
    441.Arranging Coins
    344.Reverse String
    160.Intersection of Two Linked Lists
    HDU-2521 反素数
    HDU-2710 Max Factor
    HDU-2552 三足鼎立
    HDU-2549 壮志难酬
    HDU-2548 两军交锋
    HDU-2550 百步穿杨
  • 原文地址:https://www.cnblogs.com/qq1269122125/p/3923977.html
Copyright © 2011-2022 走看看