QT无标题,透明,可以移动,可以伸缩基本实现

/      dlgresize.h

#pragma once

#include <QtCore/QtCore>
#include <QtGui/QtGui>


enum {LEFT, RIGHT, TOP, BOTTOM,LEFTTOP,RIGHTTOP,LEFTBOTTOM,RIGHTBOTTOM};

class Dlg:public QWidget
{
    Q_OBJECT
public:
    Dlg(QWidget *parent = 0);

protected:
    virtual void    paintEvent ( QPaintEvent * event );
    virtual void    mouseMoveEvent ( QMouseEvent * event );
    virtual void    mousePressEvent ( QMouseEvent * event );
    virtual void    mouseReleaseEvent( QMouseEvent * event );

private:
    int                getSideType(QPoint point);
    bool            setCursorShape(int flag);
    void            changeRectSize(int flag,QPoint globalPos);



private:

    QPoint            m_movePoint;    //移动的距离
    bool            m_pressMouse;    //按下鼠标左键
    bool            m_changeRect;    //窗口改变大小
    bool            m_curChanged;    //鼠标形状改变
    int                m_curShape;        //鼠标形状

    int                m_minWidth;
    int                m_minHeight;

};

 

dlgresize.cpp

 

#include "DlgResize.h"



Dlg::Dlg( QWidget *parent /*= 0*/ )
    :QWidget(parent)
    ,m_pressMouse(false)
    ,m_changeRect(false)
    ,m_curChanged(false)
    ,m_curShape(0)
    ,m_minWidth(100)
    ,m_minHeight(25)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    setMouseTracking(true);
    setMinimumSize(m_minWidth,m_minHeight);


}


void Dlg::mouseMoveEvent( QMouseEvent * event )
{

    if (m_pressMouse)    //移动窗口
    {
        QPoint movePos = event->globalPos();
        move(movePos - m_movePoint);
    }
    else    //改变窗口大小
    {
        if (!m_changeRect)    //如果没按下鼠标左键, 判断是否在边框    (主要是为了按下鼠标后不要再验证鼠标形状了)   
        {
            m_curShape = getSideType(event->pos());
            m_curChanged = setCursorShape(m_curShape);
        }
        else
        {
            changeRectSize(m_curShape,event->pos());
        }
    }

}

void Dlg::mousePressEvent( QMouseEvent * event )
{
    if (event->button() == Qt::LeftButton)    //只能是鼠标左键移动和改变大小
    {
        m_pressMouse = true;

        if (m_curChanged)
        {
            m_changeRect = true;
            m_pressMouse = false; //防止整个窗口移动
        }
    }

    m_movePoint = event->globalPos() - pos();    //窗口移动距离
}

void Dlg::mouseReleaseEvent( QMouseEvent * event )
{
    m_pressMouse = false;
    m_changeRect = false;
}

void Dlg::paintEvent( QPaintEvent * event )
{
    QPainter painter(this);
    painter.fillRect(this->rect(),QColor(0,0,250,50));

}


int Dlg::getSideType( QPoint point )
{
    int lenth = 5;    //设置判断指针的距离
    if (point.x()<=this->rect().left()+lenth)
    {
        if (point.y()>=this->rect().bottom()-lenth)
        {
            return LEFTBOTTOM;
        }
        else if (point.y()<=this->rect().top()+lenth)
        {
            return LEFTTOP;
        }
        return LEFT;
    }
    else if (point.x()>=this->rect().right()-lenth)
    {
        if (point.y()>=this->rect().bottom()-lenth)
        {
            return RIGHTBOTTOM;
        }
        else if (point.y()<=this->rect().top()+lenth)
        {
            return RIGHTTOP;
        }
        return RIGHT;
    }
    else if (point.y()<=this->rect().top()+lenth)
    {
        return TOP;
    }
    else if (point.y()>=this->rect().bottom()-lenth)
    {

        return BOTTOM;
    }
    return -1;
}

bool Dlg::setCursorShape( int flag )
{
    QCursor curType;
    bool shapeChanged = false;
    switch (flag)
    {
    case LEFT:
    case RIGHT:
        curType = Qt::SizeHorCursor;
        shapeChanged = true;
        break;

    case TOP:
    case BOTTOM:
        curType = Qt::SizeVerCursor;
        shapeChanged = true;
        break;
    case LEFTTOP:
    case RIGHTBOTTOM:
        curType = Qt::SizeFDiagCursor;
        shapeChanged = true;
        break;
    case RIGHTTOP:
    case LEFTBOTTOM:
        curType = Qt::SizeBDiagCursor;
        shapeChanged = true;
        break;
    default:
        curType = Qt::ArrowCursor;
        break;
    }

    this->setCursor(curType);

    return shapeChanged;
}

void Dlg::changeRectSize( int flag ,QPoint globalPos)
{
    //QPoint temp = mapToParent(this->pos());
    globalPos = mapToParent(globalPos);
    int globalX = globalPos.x();
    int globalY = globalPos.y();
    int widgetX = this->pos().x();
    int widgetY = this->pos().y();
    int LMLenght = widgetX+this->width() - globalX;    //左移距离
    int RMLenght = globalX - widgetX +1;
    int TMLenght = widgetY + this->height() - globalY;
    int BMLenght = globalY - widgetY +1;

    if (LMLenght<=m_minWidth)    //防止向右最小时窗口移动
    {
        globalX = this->pos().x();
    }
    if (TMLenght<=m_minHeight)    //防止向下最小时窗口时移动
    {
        globalY = this->pos().y();
    }

    switch (flag)
    {
    case LEFT:
        setGeometry(globalX,widgetY,LMLenght,this->height());
        break;

    case RIGHT:
        setGeometry(widgetX,widgetY,RMLenght,this->height());
        break;

    case TOP:
        setGeometry(widgetX,globalY,this->width(),TMLenght);
        break;

    case BOTTOM:
        setGeometry(widgetX,widgetY,this->width(),BMLenght);
        break;

    case LEFTTOP:
        setGeometry(globalX,globalY,LMLenght,TMLenght);
        break;
    case LEFTBOTTOM:
        setGeometry(globalX,widgetY,LMLenght,BMLenght);
        break;

    case RIGHTTOP:
        setGeometry(widgetX,globalY,RMLenght,TMLenght);
        break;

    case RIGHTBOTTOM:
        setGeometry(widgetX,widgetY,RMLenght,BMLenght);
        break;

    default:

        break;
    }

}


 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值