Qt Изменение размера окна в соответствии с соотношением сторон в области прокрутки

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

Это вызывает проблему, поскольку экран находится внутри области прокрутки, когда его высота выходит за пределы определенной точки, в которую входит полоса прокрутки. Это уменьшает ширину и, следовательно, необходимо уменьшить высоту, это может вызвать петлю, в которой полоса прокрутки продолжает входить и выходить.

Один из способов, которыми я пытался это исправить, — это взять требуемый размер и усреднить по количеству итераций функции, которая отвечает за разработку и установку размера, если среднее значение существенно не отличается от требуемого размера, размер не изменится. , Это как бы решило проблему, но мне кажется, что она не оптимальна …

Мне интересно, если у кого-нибудь есть идеи, как решить эту проблему?

//********************************************************************************
/// \brief Called to make the size of the preview pane the correct size
void PreviewDisplayWidget::SetSizeOfScreen()
{
double aspect_ratio = _preview_controls->_video_settings.getVideoFormat().GetAspectRatio();

// Calculate the new minimum size
int minimum_size = _container->width()/aspect_ratio;

// HACK TO FIX ISSUE WITH RESIZING:
// The preview sets its height from the width, if the width is changed, so will the height.
// This causes an issue with the scroll area as it can be in a situation that will cause the
// scroll area to get thinner (due to scroll bars being added), causing the width of the widget
// to change, therefore causing the height to change. Which can be enough to make the scroll bar go
// away. This can loop and cause a stack overflow.
//
// Store the last 10 sizes.
_previous_sizes.push_back(minimum_size);

const int sizes_to_scan = 10;
if (_previous_sizes.size() > sizes_to_scan)
{
_previous_sizes.pop_front();
}

int sum = 0;
for (auto i =_previous_sizes.begin(); i != _previous_sizes.end(); i++)
{
sum += *i;
}

double average = (double) sum / (double) _previous_sizes.size();

std::cout << "Average " << average << std::endl;

bool change_in_average = false;
// Significant change in average means a size change should occur
if (average > minimum_size + 5 || average < minimum_size - 5)
{
change_in_average = true;
}if (change_in_average || _previous_sizes.size() < sizes_to_scan - 1)
{
_preview_frame->setMinimumHeight(minimum_size);
std::cout << "Preview sizes " << minimum_size << std::endl;
_preview_frame->updateGeometry();
}

SetPreviewSize();
}

3

Решение

Будет ли это работать?

int minimum_size;

if(scrollArea->verticalScrollBar())
minimum_size = (_container->width()+scrollArea->verticalScrollBar()->width())/aspect_ratio;
else
minimum_size = _container->width()/aspect_ratio;
1

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

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

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