首页 > 代码库 > QT_无边框窗口拖动缩放

QT_无边框窗口拖动缩放

    public:
        int countFlag(QPoint p, int row);
        void setCursorType(int flag);
        int countRow(QPoint p);

    protected:
        void mousePressEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);
        void mouseDoubleClickEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
    private:
        bool _isleftpressed;
        int _curpos;
        QPoint _plast;
//构造
this->setMouseTracking(true);
_isleftpressed = false;
_curpos = 0;//标记鼠标左击时的位置
this->setMinimumSize(600, 400);//设置最小尺寸
   void my_window::mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton)
        {
            this->_isleftpressed = true;
            QPoint temp = event->globalPos();
            _plast = temp;
            _curpos = countFlag(event->pos(), countRow(event->pos()));
            event->ignore();
        }
    }

    void my_window::mouseReleaseEvent(QMouseEvent *event)
    {
        if (_isleftpressed)
            _isleftpressed = false;
        setCursor(Qt::ArrowCursor);
        event->ignore();
    }

    void my_window::mouseDoubleClickEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton)
        {
            if (windowState() != Qt::WindowFullScreen)
                setWindowState(Qt::WindowFullScreen);
            else setWindowState(Qt::WindowNoState);//恢复正常模式
        }
        event->ignore();
    }

    void my_window::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
    {

        int poss = countFlag(event->pos(), countRow(event->pos()));
        setCursorType(poss);
        if (_isleftpressed)//是否左击
        {
            QPoint ptemp = event->globalPos();
            ptemp = ptemp - _plast;
            if (_curpos == 22)//移动窗口
            {
                ptemp = ptemp + pos();
                move(ptemp);
            }
            else
            {
                QRect wid = geometry();
                switch (_curpos)//改变窗口的大小
                {

                case 11:wid.setTopLeft(wid.topLeft() + ptemp); break;//左上角
                case 13:wid.setTopRight(wid.topRight() + ptemp); break;//右上角
                case 31:wid.setBottomLeft(wid.bottomLeft() + ptemp); break;//左下角
                case 33:wid.setBottomRight(wid.bottomRight() + ptemp); break;//右下角
                case 12:wid.setTop(wid.top() + ptemp.y()); break;//中上角
                case 21:wid.setLeft(wid.left() + ptemp.x()); break;//中左角
                case 23:wid.setRight(wid.right() + ptemp.x()); break;//中右角
                case 32:wid.setBottom(wid.bottom() + ptemp.y()); break;//中下角
                }
                setGeometry(wid);
            }

            _plast = event->globalPos();//更新位置
        }
        event->ignore();
    }



    int my_window::countFlag(QPoint p, int row)//计算鼠标在哪一列和哪一行
    {
        if (p.y()<MARGIN)
            return 10 + row;
        else if (p.y()>this->height() - MARGIN)
            return 30 + row;
        else
            return 20 + row;
    }

    void my_window::setCursorType(int flag)//根据鼠标所在位置改变鼠标指针形状
    {
        Qt::CursorShape cursor;
        switch (flag)
        {
        case 11:
        case 33:
            cursor = Qt::SizeFDiagCursor; break;
        case 13:
        case 31:
            cursor = Qt::SizeBDiagCursor; break;
        case 21:
        case 23:
            cursor = Qt::SizeHorCursor; break;
        case 12:
        case 32:
            cursor = Qt::SizeVerCursor; break;
        case 22:
            //cursor = Qt::OpenHandCursor; break;
            cursor = Qt::ArrowCursor; break;
        default:
            cursor = Qt::ArrowCursor; break;
            break;

        }
        setCursor(cursor);
    }

    int my_window::countRow(QPoint p)//计算在哪一列
    {
        return (p.x()<MARGIN) ? 1 : (p.x()>(this->width() - MARGIN) ? 3 : 2);
    }

技术分享

QT_无边框窗口拖动缩放