如何实现缩放窗口,窗口比例不变? 我尝试重写resizeEvent 但是没有任何效果 您知不知道如何实现呢?
Unsolved
Chinese
-
implement the following:
int QWidget::heightForWidth( int w ) { return w; }
https://doc.qt.io/qt-5/qwidget.html#heightForWidth -
@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缩放 但是如果鼠标停留在标题栏 无法改变鼠标样式 您知道如何做吗?