Как заблокировать соотношение сторон при изменении размера окна?

У меня есть приложение qt, которое открывает окно для отображения изображения. Я хочу, чтобы иметь возможность изменить размер окна и сохранить соотношение сторон окна. Оригинальный размер окна 480х640 (ширина х высота). Я хочу, чтобы при изменении ширины я изменял высоту вместе с ней, а при изменении высоты менял ширину вместе с ней. Как я могу определить, меняю ли я ширину или высоту окна.

Я реализовал код ниже, и он поддерживает соотношение сторон при изменении ширины, но я не могу изменить высоту окна. Я не могу сделать высоту меньше или больше.

Код ниже создает окно.

#ifndef VideoWidget_h
#define VideoWidget_h

#include <iostream>

// Qt libraries
#include <QApplication>
#include <QtCore>
#include <QWidget>
#include <QGLWidget>

using namespace cv;
using namespace std;

class VideoWidget : public QGLWidget
{
Q_OBJECT

public:
VideoWidget()
{

}

protected:

void resizeGL(int width, int height)
{
const float ASPECT_RATIO = (float) WIDTH / (float) HEIGHT;
const float aspect_ratio = (float) width / (float) height;

if (aspect_ratio > ASPECT_RATIO) {
height = (1.f / ASPECT_RATIO) * width;
resize(width, height);
} else if (aspect_ratio < ASPECT_RATIO) {
height = ASPECT_RATIO * height;
resize(width, height);
}
}

private:
int WIDTH = 480;
int HEIGHT = 640;

};#endif /* VideoWidget_h */

Код ниже является основной функцией.

#include <iostream>

// Qt libraries
#include <QApplication>
#include <QtCore>
#include <QWidget>
#include <QGLWidget>

#include "VideoWidget.h"
using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
QApplication app (argc, argv);

VideoWidget v;
v.resize(480, 640);
v.show();

return app.exec();
}

1

Решение

Как заблокировать соотношение сторон при изменении размера окна?

В этом случае мы можем воспользоваться перегрузкой QWidget ::resizeEvent:

void MyWidget::resizeEvent(QResizeEvent *event)
{
static const float ratioY2X = (float) HEIGHT / (float) WIDTH;

// QResizeEvent type has oldSize() and size()
// and size() has an actual new size for the widget
// so we can just take it and apply the ratio.

// first try to detect the direction of the widget resize
if (event->oldSize().width() != event->size().width())
this->resize(event->size().width(),             // apply the correct ratio
event->size().width() * ratioY2X); // to either of width/height
else
this->resize(event->size().height() / ratioY2X, // apply the correct ratio
event->size().height());           // to either of width/height
event->accept(); // we've finished processing resize event here
}

Имейте в виду, что для этого решения не применялись подсказки по размеру (по умолчанию).

Постскриптум Я исправил это решение с if оператор после того, как на самом деле пытается отладить его. Если мы изменим размер виджета, перетаскивая его угол, тогда ширина будет приоритетом (нужно выбрать один, как еще это может работать?)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]