Qt:自定义窗口之窗口缩放

来源:互联网 发布:量子统计 淘宝 编辑:程序博客网 时间:2024/05/18 02:15

                当我们隐藏了系统窗口后,无法完成对窗口的缩放,这里缩放方法通过重写一些鼠标事件来实现。具体代码如下:

    头文件:

#define PADDING 2class MainFrame : public QWidget{    Q_OBJECTpublic:    MainFrame(QWidget *parent = 0);    ~MainFrame();protected:    void mouseReleaseEvent(QMouseEvent *event);    void mouseMoveEvent(QMouseEvent *event);    void mousePressEvent(QMouseEvent *event);private:    void region(const QPoint &cursorPoint);   private:    MainWindow *mainwindow = nullptr;    bool isLeftPressDown;    QPoint dragPosition;    enum Direction{        UP = 0,        DOWN=1,        LEFT,        RIGHT,        LEFTTOP,        LEFTBOTTOM,        RIGHTBOTTOM,        RIGHTTOP,        NONE    };    Direction dir;};
     cpp:

void MainFrame::mouseReleaseEvent(QMouseEvent *event){    if(event->button() == Qt::LeftButton) {        isLeftPressDown = false;        this->releaseMouse();        this->setCursor(QCursor(Qt::ArrowCursor));    }    QWidget::mouseReleaseEvent(event);}void MainFrame::mousePressEvent(QMouseEvent *event){    if(event->button() == Qt::LeftButton){        isLeftPressDown = true;        if(dir != NONE) {            this->mouseGrabber();        }    }    QWidget::mousePressEvent(event);}void MainFrame::mouseMoveEvent(QMouseEvent *event){    QPoint gloPoint = event->globalPos();    QRect rect = this->rect();    QPoint tl = mapToGlobal(rect.topLeft());    QPoint rb = mapToGlobal(rect.bottomRight());    if(!isLeftPressDown) {        this->region(gloPoint);    } else {        if(dir != NONE) {            QRect rMove(tl, rb);            switch(dir) {            case LEFT:                if(rb.x() - gloPoint.x() <= this->minimumWidth())                    rMove.setX(tl.x());                else                    rMove.setX(gloPoint.x());                break;            case RIGHT:                rMove.setWidth(gloPoint.x() - tl.x());                break;            case UP:                if(rb.y() - gloPoint.y() <= this->minimumHeight())                    rMove.setY(tl.y());                else                    rMove.setY(gloPoint.y());                break;            case DOWN:                rMove.setHeight(gloPoint.y() - tl.y());                break;            case LEFTTOP:                if(rb.x() - gloPoint.x() <= this->minimumWidth())                    rMove.setX(tl.x());                else                    rMove.setX(gloPoint.x());                if(rb.y() - gloPoint.y() <= this->minimumHeight())                    rMove.setY(tl.y());                else                    rMove.setY(gloPoint.y());                break;            case RIGHTTOP:                rMove.setWidth(gloPoint.x() - tl.x());                if(rb.y() - gloPoint.y() <= this->minimumHeight())                    rMove.setY(tl.y());                else                    rMove.setY(gloPoint.y());                break;            case LEFTBOTTOM:                rMove.setHeight(gloPoint.y() - tl.y());                if(rb.x() - gloPoint.x() <= this->minimumWidth())                    rMove.setX(tl.x());                else                    rMove.setX(gloPoint.x());                break;            case RIGHTBOTTOM:                rMove.setWidth(gloPoint.x() - tl.x());                rMove.setHeight(gloPoint.y() - tl.y());                break;            default:                break;            }            this->setGeometry(rMove);        }    }    QWidget::mouseMoveEvent(event);}void MainFrame::region(const QPoint &cursorGlobalPoint){    QRect rect = this->rect();    QPoint tl = mapToGlobal(rect.topLeft());    QPoint rb = mapToGlobal(rect.bottomRight());    int x = cursorGlobalPoint.x();    int y = cursorGlobalPoint.y();    if(tl.x() + PADDING >= x && tl.x() <= x && tl.y() + PADDING >= y && tl.y() <= y) {        // 左上角        dir = LEFTTOP;        this->setCursor(QCursor(Qt::SizeFDiagCursor));    } else if(x >= rb.x() - PADDING && x <= rb.x() && y >= rb.y() - PADDING && y <= rb.y()) {        // 右下角        dir = RIGHTBOTTOM;        this->setCursor(QCursor(Qt::SizeFDiagCursor));    } else if(x <= tl.x() + PADDING && x >= tl.x() && y >= rb.y() - PADDING && y <= rb.y()) {        //左下角        dir = LEFTBOTTOM;        this->setCursor(QCursor(Qt::SizeBDiagCursor));    } else if(x <= rb.x() && x >= rb.x() - PADDING && y >= tl.y() && y <= tl.y() + PADDING) {        // 右上角        dir = RIGHTTOP;        this->setCursor(QCursor(Qt::SizeBDiagCursor));    } else if(x <= tl.x() + PADDING && x >= tl.x()) {        // 左边        dir = LEFT;        this->setCursor(QCursor(Qt::SizeHorCursor));    } else if( x <= rb.x() && x >= rb.x() - PADDING) {        // 右边        dir = RIGHT;        this->setCursor(QCursor(Qt::SizeHorCursor));    }else if(y >= tl.y() && y <= tl.y() + PADDING){        // 上边        dir = UP;        this->setCursor(QCursor(Qt::SizeVerCursor));    } else if(y <= rb.y() && y >= rb.y() - PADDING) {        // 下边        dir = DOWN;        this->setCursor(QCursor(Qt::SizeVerCursor));    }else {        // 默认        dir = NONE;        this->setCursor(QCursor(Qt::ArrowCursor));    }}

效果