qt中鼠标拖动子界面应用

public:

void mousePressEvent(QMouseEvent *event);

void mouseMoveEvent(QMouseEvent *event);

void mouseReleaseEvent(QMouseEvent *event);

public:

int m_EdgeMargin;

private:

void CheckEdge();

private:

Ui::MonitorDisplay_Form *ui;

QPoint m_StartCursor;

int m_LeftOff = 0;//鼠标开始拖拽时子窗口左边相对父窗口左边的距离

int m_RightOff = 0;

int m_TopOff = 0;

int m_BottomOff = 0;

QPoint DragPosition;//鼠标拖动的位置

int EdgePosition;//鼠标检测的边缘距离

enum{

Nodir,

Top = 0x01,

Bottom = 0x02,

Left = 0x04,

Right = 0x08,

TopLeft = 0x01|0x04,

TopRight = 0x02|0x08,

BottomLeft = 0x02|0x04,

BottomRight = 0x02|0x08

复制代码
}ResizeDir;

.cpp文件

void MonitorDisplay_Form::mousePressEvent(QMouseEvent *event)

{

event->ignore();

if(event->button()==Qt::LeftButton)//按下鼠标左键记录一次位置

{

DragPosition = event->globalPos()-frameGeometry().topLeft();//获得鼠标按键位置相对窗口左上面的位置

m_StartCursor = event->globalPos();

m_LeftOff = frameGeometry().left();

m_RightOff = frameGeometry().right();

m_TopOff = frameGeometry().top();

m_BottomOff = frameGeometry().bottom();

}

}

void MonitorDisplay_Form::mouseMoveEvent(QMouseEvent *event)

{

event->ignore();

if(event->button()& Qt::LeftButton)//如果左键按下

{

if(ResizeDir ==Nodir)//鼠标未放置在边缘出,进行窗口整体拖动处理

{

move(event->globalPos()-DragPosition);

}

else

{

int pTop,pBottom,pLeft,pRight;

pTop = m_TopOff;

pBottom = m_BottomOff;

pLeft = m_LeftOff;

pRight = m_RightOff;

if(ResizeDir & Top )//拖拽顶部上下变化

{

pTop = m_TopOff-(m_StartCursor.ry()-event->globalY());

if(this->height() <= minimumHeight())//进行极端最小值处理

{

pTop = Min(m_BottomOff-minimumHeight(),pTop);

复制代码
            }
            else if(this->height() >=maximumHeight())
            {
                pTop = MAX(m_BottomOff-maximumHeight(),pTop);
            }

        }
        else if(ResizeDir &Bottom)
        {
            pBottom = m_BottomOff+(event->globalY()-m_StartCursor.ry());
            if(this->height() <= minimumHeight())//进行极端最小值处理
            {
                pBottom = m_TopOff+minimumHeight();

            }
            else if(this->height() >=maximumHeight())
            {
                pTop =m_TopOff+maximumHeight();
            }
        }
        if(ResizeDir & Left )//拖拽顶部上下变化
        {
            pLeft = m_RightOff-(m_StartCursor.rx()-event->globalX());
            if(this->width() <= minimumWidth())//进行极端最小值处理
            {
                pLeft = Min(pLeft,m_RightOff-minimumWidth());

            }
            else if(this->width() >=maximumWidth())
            {
                pLeft = MAX(m_RightOff-maximumWidth(),pLeft);
            }

        }
        else if(ResizeDir &Right)
        {
            pRight = m_RightOff+(event->globalX()-m_StartCursor.rx());
            if(this->width() <= minimumWidth())//进行极端最小值处理
            {
                pRight = m_LeftOff+minimumWidth();

            }
            else if(this->width() >=maximumWidth())
            {
                pRight =m_LeftOff+this->maximumWidth();
            }
        }
        setGeometry(pLeft,pTop,pRight-pLeft,pBottom-pTop);
    }

}
else {
    CheckEdge();
}

}

void MonitorDisplay_Form::mouseReleaseEvent(QMouseEvent *event)

{

event->ignore();

if(ResizeDir != Nodir)//还原鼠标样式

{

CheckEdge();

}

}

void MonitorDisplay_Form::CheckEdge()

{

QPoint Pos = this->mapFromGlobal(QCursor::pos());

复制代码
int DiffLeft = Pos.rx();
int DiffRight = this->width()-DiffLeft;
int DiffTop = Pos.ry();
int DiffBottom = this->height();-DiffTop;
QCursor TempCursor;
TempCursor = cursor();
if(DiffTop<m_EdgeMargin)
{

}
if(DiffTop < m_EdgeMargin)
    {                              //根据 边缘距离 分类改变尺寸的方向
        if(DiffLeft < m_EdgeMargin)
        {
            ResizeDir = TopLeft;
            TempCursor.setShape(Qt::SizeFDiagCursor);
        }
        else if(DiffRight < m_EdgeMargin)
        {
            ResizeDir = TopRight;
            TempCursor.setShape(Qt::SizeBDiagCursor);
        }
        else
        {
            ResizeDir = Top;
            TempCursor.setShape(Qt::SizeVerCursor);
        }
    }
    else if(DiffBottom < m_EdgeMargin)
    {
        if(DiffLeft < m_EdgeMargin)
        {
            ResizeDir = BottomLeft;
            TempCursor.setShape(Qt::SizeBDiagCursor);
        }
        else if(DiffRight < m_EdgeMargin)
        {
            ResizeDir = BottomRight;
            TempCursor.setShape(Qt::SizeFDiagCursor);
        }
        else
        {
            ResizeDir = Bottom;
            TempCursor.setShape(Qt::SizeVerCursor);
        }
    }
    else if(DiffLeft < m_EdgeMargin)
    {
        ResizeDir = Left;
        TempCursor.setShape(Qt::SizeHorCursor);
    }
    else if(DiffRight < m_EdgeMargin)
    {
        ResizeDir = Right;
        TempCursor.setShape(Qt::SizeHorCursor);
    }
    else
    {
        ResizeDir = Nodir;
        TempCursor.setShape(Qt::ArrowCursor);
    }

    setCursor(TempCursor);

}