У меня есть приложение 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();
}
Как заблокировать соотношение сторон при изменении размера окна?
В этом случае мы можем воспользоваться перегрузкой 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
оператор после того, как на самом деле пытается отладить его. Если мы изменим размер виджета, перетаскивая его угол, тогда ширина будет приоритетом (нужно выбрать один, как еще это может работать?)
Других решений пока нет …