@JoeCFD 无法完全解决我的问题,因为改变高度时,窗口就会变形,无法保持 16:9
KeepAspectRatio::KeepAspectRatio(QWidget *getWindow)
{
getWindow->setMouseTracking(true);
getWindow->installEventFilter(this);
this->window = getWindow;
}
bool KeepAspectRatio::eventFilter(QObject *obj, QEvent *event)
{
//qDebug() << obj << this->parent();
if(this->window == obj)
{
//qDebug() << "in";
widget = static_cast<QWidget *>(obj);
QMouseEvent *me = static_cast<QMouseEvent *>(event);
switch(event->type())
{
case QEvent::MouseButtonPress:
{
if(this->moveUnkown == true)
{
//qDebug() << "this->moveUnkown == true";
break;
}
else if(this->moveLeft == true || this->moveRight == true || this->moveTop == true || this->moveBottom == true)
{
this->isPressMove = true;
//qDebug() << "this->isPressMove = true";
}
//qDebug() << "this->moveUnkown == false";
break;
}
case QEvent::MouseMove:
{
//qDebug() << me->globalPos().x() << oldGlobalPoint.x();
//qDebug() << abs(me->globalPos().x() - oldGlobalPoint.x());
if(this->isPressMove == true)
{
if(this->moveLeft == true)
{
int changeX = oldGlobalPoint.x() - me->globalPos().x();
changeWindow(changeX, 0);
}
else if(this->moveRight == true)
{
int changeX = me->globalPos().x() - oldGlobalPoint.x() - oldSize.width();
changeWindow(changeX, 0);
}
else if(this->moveBottom == true)
{
int changeY = me->globalPos().y() - oldGlobalPoint.y() - oldSize.height() - (widget->frameGeometry().height() - widget->height());
//qDebug() << me->globalPos().y() << oldGlobalPoint.y() << oldSize.height() << "changeY = " << changeY;
changeWindow(0, changeY);
}
else if(this->moveTop == true)
{
}
}
//qDebug() << me->globalPos().x() << oldGlobalPoint.x();
//if left right
if(abs(me->globalPos().x() - widget->pos().x()) < 5 || abs(widget->pos().x() + widget->frameGeometry().width() - me->globalPos().x()) < 5)
{
//qDebug() << "set Qt::SizeHorCursor";
widget->setCursor(Qt::SizeHorCursor);
if(abs(me->globalPos().x() - widget->pos().x()) < 5)
{
//qDebug() << "this->moveLeft = true";
this->moveLeft = true;
this->moveUnkown = false;
}
if(abs(widget->pos().x() + widget->frameGeometry().width() - me->globalPos().x()) < 5)
{
this->moveRight = true;
this->moveUnkown = false;
//qDebug() << "this->moveRight = true";
}
}
else if(abs(me->globalPos().y() - widget->pos().y() - widget->frameGeometry().height()) < 5 || widget->frameGeometry().height() - widget->height() + NonCliAreaMePoint.y() < 5)
{
widget->setCursor(Qt::SizeVerCursor);
if(abs(me->globalPos().y() - widget->pos().y() - widget->frameGeometry().height()) < 5)
{
this->moveBottom = true;
this->moveUnkown = false;
}
if(widget->frameGeometry().height() - widget->height() + NonCliAreaMePoint.y() < 5)
{
this->moveTop = true;
this->moveUnkown = false;
}
}
else
{
widget->setCursor(Qt::ArrowCursor);
if(this->isPressMove == false)
{
this->moveLeft = false;
this->moveRight = false;
this->moveBottom = false;
this->moveUnkown = true;
}
}
break;
}
case QEvent::MouseButtonRelease:
{
this->isPressMove = false;
this->moveLeft = false;
this->moveRight = false;
this->moveUnkown = true;
//////////////
oldSize = widget->size();
oldGlobalPoint = widget->pos();
widget->setFixedSize(widget->size());
//qDebug() << oldSize << oldGlobalPoint;
/////////////
//qDebug() << "MouseButtonRelease";
break;
}
case QEvent::Show:
{
oldSize = widget->size();
oldGlobalPoint = widget->pos();
widget->setFixedSize(widget->size());
//qDebug() << oldGlobalPoint << oldSize;
break;
}
case QEvent::NonClientAreaMouseMove:
{
this->NonCliAreaMePoint = me->pos();
//qDebug() << NonCliAreaMePoint.y() << widget->pos().y();
//qDebug() << widget->frameGeometry().height() - widget->height() + NonCliAreaMePoint.y();
}
case QEvent::NonClientAreaMouseButtonRelease:
{
oldGlobalPoint = widget->pos();
}
default:
break;
}
}
return QWidget::eventFilter(obj, event);
}
void KeepAspectRatio::changeWindow(int changeX, int changeY)
{
if(this->moveLeft == true)
{
newGlobalPoint.setX(oldGlobalPoint.x() - changeX);
newGlobalPoint.setY(oldGlobalPoint.y());
newSize.setWidth(oldSize.width() + changeX);
newSize.setHeight(newSize.width() * 9 / 16);
}
else if(this->moveRight == true)
{
newGlobalPoint.setX(oldGlobalPoint.x());
newGlobalPoint.setY(oldGlobalPoint.y());
newSize.setWidth(oldSize.width() + changeX);
newSize.setHeight(newSize.width() * 9 / 16);
}
else if(this->moveBottom == true)
{
newGlobalPoint.setX(oldGlobalPoint.x());
newGlobalPoint.setY(oldGlobalPoint.y());
newSize.setHeight(oldSize.height() + changeY);
newSize.setWidth(newSize.height() * 16 / 9);
qDebug() << newGlobalPoint << newSize;
}
if(newSize.width() < 1280 || newSize.height() < 720)
{
return;
}
oldSize = widget->size();
oldGlobalPoint = widget->pos();
widget->move(newGlobalPoint);
widget->setFixedSize(newSize);
}
这段代码 可以实现左边 右边和下面拖动 保持16:9缩放 但是我想要实现,上方拖动 保持16:9缩放 但是如果鼠标停留在标题栏 无法改变鼠标样式 您知道如何做吗?