Как сохранить квадратное соотношение сторон для QFrame в Qt?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как сохранить квадратное соотношение сторон для QFrame в Qt?

Сообщение Anonymous »

Я работаю над приложением Qt, в котором у меня есть окно-наложение, которое должно поддерживать квадратное соотношение сторон независимо от того, как оно изменяется. В моем приложении одновременно открыты два окна, и оба являются окнами верхнего уровня. Я хочу, чтобы окно наложения, представляющее собой QFrame, оставалось квадратом при изменении размера от угла.
Это код для моего класса окна наложения:

Код: Выделить всё

#include "overlaywindow.h"

OverlayWindow::OverlayWindow(QFrame* parent) :
QFrame(parent),
m_isMeasurementRunning(false),
m_aspectRatio(1.0)
{
// Set initial appearance, and behavior of the overlay window.
setWindowOpacity(0.5);
setStyleSheet("border: 1.5px solid black;background-color:#A9A9A9;");
setCursor(Qt::SizeAllCursor);
setMinimumSize(50, 50);

// Set maximum size based on the screen dimensions and position the window.
QRect screenRect = screen()->geometry();
setMaximumSize(screenRect.width(), screenRect.height());
setGeometry(screenRect.width() / 2 - 125, screenRect.height() / 2 - 125, 250, 250);
}

void OverlayWindow::setMeasurementState(bool state)
{
m_isMeasurementRunning = state;

// Adjust window properties based on the measurement state.
if (state)
{
setFixedSize(geometry().width(), geometry().width());
setCursor(Qt::ForbiddenCursor);
}
else
{
QRect screenRect = screen()->geometry();
setMaximumSize(screenRect.width(), screenRect.height());
setMinimumSize(50, 50);
setCursor(Qt::SizeAllCursor);
}
}

void OverlayWindow::mousePressEvent(QMouseEvent* event)
{
m_dragPos = event->pos();
}

void OverlayWindow::mouseMoveEvent(QMouseEvent* event)
{
if (m_isMeasurementRunning)
{
// Ignore mouse move events if measurement is running.
event->ignore();
}
else
{
// Move the window while dragging, ensuring it stays within screen bounds.
if (checkBounds(event))
{
move(
event->globalPosition().x() - m_dragPos.x(),
event->globalPosition().y() - m_dragPos.y());
}
}
}

void OverlayWindow::resizeEvent(QResizeEvent* event)
{
// Maintain aspect ratio by making the window square during resize.
if (event->size().width() != event->oldSize().width())
{
resize(event->size().height(), event->size().height());
}
else
{
resize(event->size().width(), event->size().width());
}
}
А это контроллер:

Код: Выделить всё

#include "windowscontroller.h"

WindowsController::WindowsController(
MainWindow*    mainWindow,
OverlayWindow* overlayWindow,
FrameCounter*  framecounter,
QString        logDirectory) :
m_mainWindow(mainWindow),
m_overlayWindow(overlayWindow),
m_fpslogger(logDirectory),
m_framecounter(framecounter),
m_exit(false),
m_commandLineExec(false)
{
// Connect signals from MainWindow to controller's slots
connect(
m_mainWindow,
&MainWindow::measurementToggled,
this,
&WindowsController::onToggleMeasurement);
connect(m_mainWindow, &MainWindow::exitRequested, this, &WindowsController::onExitRequested);

// Connect signals from OverlayWindow to controller's slots
connect(
m_overlayWindow,
&OverlayWindow::exitRequested,
this,
&WindowsController::onExitRequested);

// Connect signals from FrameCounter to controller's slots
connect(m_framecounter, &FrameCounter::newfpsvalue, this, &WindowsController::updateDisplay);
}

void WindowsController::showWindows()
{
// Display the main window and the overlay window
m_mainWindow->setWindowFlags(Qt::Window);

m_overlayWindow->setWindowFlags(
Qt::Window | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);

m_overlayWindow->show();
m_mainWindow->show();
}
Текущая реализация использует функцию resizeEvent для поддержания соотношения сторон окна в виде квадрата, устанавливая равные ширину и высоту. Но когда я пытаюсь изменить размер сверху или слева, окно наложения также перемещается. И насколько я понял, heightForWidth() не работает для окон верхнего уровня. Я также пробовал несколько решений, найденных на форуме, таких как это или это, но ни одно из них не работает.
Какие изменения мне следует внести, чтобы окно наложения всегда сохраняло квадратное соотношение сторон? , даже если размер изменен пользователем?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/785 ... rame-in-qt
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»