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);
}