织芜 2023-09-23 23:16 采纳率: 70.8%
浏览 9

Qt代码,运行后会崩溃,为什么

Qt代码,运行后会崩溃,为什么


#include "widget.h"
#include<QEvent>
#include<QDebug>
#include<QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    isSizing=false;
    background.load(":/image/background.png");
    m_AspectRatio=3/4;
    parent->installEventFilter(this);
    setStyleSheet("background-image:url(:/image/background.png);");
}

Widget::~Widget()
{
}

void Widget::ChangeWidget(QWidget* wid,QPoint current){
    QPoint moveP(current.x()-OriginalPos.x(),current.y()-OriginalPos.y());
    QPoint newPos = {0,0};        //当从左边调整窗口大小时还需要移动窗口
    int width=OriginalSize.width();
    int height=OriginalSize.height();
    switch(direction){
    case BottomLeft:
        width=OriginalSize.width()-moveP.x();
        height=OriginalSize.height()+moveP.y();
        if(width>height*m_AspectRatio){
            width=height*m_AspectRatio;
        }
        else{
            height=width/m_AspectRatio;
        }
        newPos.setY(OriginalPos.y());//不允许向下调整
        //根据调整后的尺寸和调整前的尺寸来计算x轴移动位置
        newPos.setX(OriginalPos.x() - (width - OriginalSize.width())); //为什么不直接像left那样?因为width会调整
        break;
    case BottomRight:
        width=OriginalSize.width()+moveP.x();
        height=OriginalSize.height()+moveP.y();
        if(width>height*m_AspectRatio){
            width=height*m_AspectRatio;
        }
        else{
            height=width/m_AspectRatio;
        }
        break;
    case Bottom:
        height=OriginalSize.height()+moveP.y();
        width=height*m_AspectRatio;
        break;
    case Left:
        width=OriginalSize.width()-moveP.x();
        height=width/m_AspectRatio;
        newPos.setY(OriginalPos.y());//不允许向下调整
        //根据调整后的尺寸和调整前的尺寸来计算x轴移动位置
        newPos.setX(current.x());
        break;
    case Right:
        width=OriginalSize.width()+moveP.x();
        height=width/m_AspectRatio;
        break;
    default:break;
        if (height < MinSize.height() || width< MinSize.width())
        {
            return;
        }
        wid->resize(width,height);
        //wid->setFixedSize(width,height);
        if(newPos!=QPoint(0,0)){
            wid->move(newPos);
        }
    }
}

bool Widget::eventFilter(QObject *watched, QEvent *event){
            qDebug()<<event->type();
    if (parent() != watched)
        {
        qDebug()<<"出错.";
            return false;
        }
    QWidget* CurrentWidget=static_cast<QWidget*>(watched);
    if (nullptr == CurrentWidget)
        {
            return false;
        }

    switch (event->type()) {
        case QEvent::MouseButtonPress:{
            OriginalSize=CurrentWidget->size();
            CurrentWidget->grabMouse();
            QMouseEvent* me=static_cast<QMouseEvent*>(event);
            OriginalPos=me->globalPos();
            isSizing=true;
            break;
        }
        case QEvent::HoverMove:{
            QHoverEvent* he=static_cast<QHoverEvent*>(event);
            if(!isSizing){
                bool w=false;
                bool h=false;
                if(he->pos().x()<5||he->pos().x()>OriginalSize.width()-5){
                    w=true;
                }
                if(he->pos().y()>OriginalSize.height()-5){
                    //dont support top
                    h=true;
                }
                if(h&&w){
                    if(he->pos().x()<5){
                        CurrentWidget->setCursor(Qt::SizeBDiagCursor);
                        direction=BottomLeft;
                    }
                    else{
                        CurrentWidget->setCursor(Qt::SizeFDiagCursor);
                        direction=BottomRight;
                    }
                }
                else if(h){
                    CurrentWidget->setCursor(Qt::SizeVerCursor);
                    direction=Bottom;
                }
                else if(w){
                    CurrentWidget->setCursor(Qt::SizeHorCursor);
                    if(he->pos().x()<5)direction=Left;
                    else direction=Right;
                }
                else direction=No;CurrentWidget->unsetCursor();
            }
            break;
        }
        case QEvent::MouseMove:{
            QMouseEvent* me=static_cast<QMouseEvent*>(event);
            if(isSizing){
                QPoint CurrentPos=me->globalPos();
                ChangeWidget(CurrentWidget,CurrentPos);
            }
            else{
                bool w=false;
                bool h=false;
                if(me->pos().x()<5||me->pos().x()>OriginalSize.width()-5){
                    w=true;
                }
                if(me->pos().y()>OriginalSize.height()-5){
                    //dont support top
                    h=true;
                }
                if(h&&w){
                    if(me->pos().x()<5){
                        CurrentWidget->setCursor(Qt::SizeBDiagCursor);
                        direction=BottomLeft;
                    }
                    else{
                        CurrentWidget->setCursor(Qt::SizeFDiagCursor);
                        direction=BottomRight;
                    }
                }
                else if(h){
                    CurrentWidget->setCursor(Qt::SizeVerCursor);
                    direction=Bottom;
                }
                else if(w){
                    CurrentWidget->setCursor(Qt::SizeHorCursor);
                    if(me->pos().x()<5)direction=Left;
                    else direction=Right;
                }
                else direction=No;CurrentWidget->unsetCursor();
            }
            break;
        }
    case QEvent::MouseButtonRelease:{
            CurrentWidget->releaseMouse();
            OriginalSize=CurrentWidget->size();
            isSizing=false;
        }
    case QEvent::Show:{
        //如果窗口在实例创建之后才显示出来,
                //在此处获取窗口尺寸和最小尺寸
            OriginalSize = CurrentWidget->frameGeometry().size();
            //设置固定大小,这样窗口不再可以调整大小
            MinSize=minimumSizeHint();
            //CurrentWidget->setFixedSize(OriginalSize);
            m_AspectRatio = 1.0 * OriginalSize.width() / OriginalSize.height();
            break;
        }
        default:
        break;
    }
    return QWidget::eventFilter(watched,event);
}

  • 写回答

4条回答 默认 最新

  • threenewbee 2023-09-23 23:33
    关注

    用调试方式运行程序,这样可以找到导致崩溃的代码行。这漫无目的看,肯定看不出来什么。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月23日

悬赏问题

  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错