Exploring Alternatives to QWindow::size() in Qt


What is QWindow::size()?

In Qt, QWindow::size() is a member function of the QWindow class. It's used to retrieve the current size (width and height) of a window as a QSize object. This QSize object contains two integer values:

  • height
    The vertical dimension of the window in pixels.
  • width
    The horizontal dimension of the window in pixels.

How to Use QWindow::size()

You can call size() on a QWindow object to get its current dimensions:

#include <QApplication>
#include <QWindow>

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

  // Create a window
  QWindow window;
  window.show();

  // Get the current size
  QSize windowSize = window.size();
  int width = windowSize.width();
  int height = windowSize.height();

  // ... (use the width and height as needed)

  return app.exec();
}

Important Considerations

  • If you need to get the geometry that includes decorations, consider using geometry() instead.
  • The size returned by size() might not reflect the exact size of the window on the screen. This is because it might not include the decorations (title bar, borders, etc.) depending on the platform and window flags.

Setting Window Size

To set the size of a QWindow, you can use the resize() function:

window.resize(width, height);

Example

#include <QApplication>
#include <QWindow>

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

  QWindow window;
  window.show();

  QSize initialSize = window.size();
  qDebug() << "Initial size:" << initialSize;

  window.resize(640, 480);

  return app.exec();
}

This code will print the initial size of the window (which might vary depending on your platform) and then resize it to 640 pixels wide and 480 pixels high.

  • QWindow is the base class for most Qt windows, including QWidget, QMainWindow, and others. So, size() and resize() can be used with these classes as well.


Resizing the Window to a Percentage of the Screen

#include <QApplication>
#include <QWindow>
#include <QDesktopWidget>

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

  QWindow window;
  window.show();

  // Get the available screen geometry
  QDesktopWidget* desktop = QApplication::desktop();
  QRect screenGeometry = desktop->availableGeometry(this);

  // Set the window size to 70% of the available screen size
  double resizeFactor = 0.7;
  int newWidth = static_cast<int>(screenGeometry.width() * resizeFactor);
  int newHeight = static_cast<int>(screenGeometry.height() * resizeFactor);
  window.resize(newWidth, newHeight);

  return app.exec();
}

This code retrieves the available screen geometry and then resizes the window to 70% of the available width and height.

Reacting to Window Size Changes

#include <QApplication>
#include <QWindow>

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

  QWindow window;
  window.show();

  // Connect to the sizeChanged() signal
  QObject::connect(&window, &QWindow::sizeChanged,
                   [&window] {
                     QSize newSize = window.size();
                     qDebug() << "Window resized to:" << newSize;
                   });

  // ... (other code)

  return app.exec();
}

This code connects to the sizeChanged() signal emitted by the window whenever its size changes. When the signal is emitted, the connected lambda function retrieves the new size using size() and prints it to the debug output.

Constraining Window Size

#include <QApplication>
#include <QWindow>

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

  QWindow window;
  window.show();

  // Set minimum and maximum size constraints
  int minWidth = 320;
  int minHeight = 240;
  int maxWidth = 800;
  int maxHeight = 600;
  window.setMinimumSize(minWidth, minHeight);
  window.setMaximumSize(maxWidth, maxHeight);

  // ... (other code)

  return app.exec();
}

This code sets minimum and maximum size constraints for the window using setMinimumSize() and setMaximumSize(). This ensures that the window cannot be resized smaller than the specified minimum dimensions or larger than the maximum dimensions.



    • This member function of QWindow (and derived classes like QWidget) returns the geometry of the window, which includes its position (x and y coordinates) and size (width and height). It's a QRect object.
    • Use this if you need both the position and size of the window:
    QRect windowGeometry = window.geometry();
    int width = windowGeometry.width();
    int height = windowGeometry.height();
    
  1. frameGeometry()

    • This function (also available in QWindow and derived classes) returns the geometry of the window including its frame (title bar, borders, etc.). It considers window decorations.
    • Use this if you need the size that reflects the actual visible area on the screen, including decorations:
    QRect windowFrameGeometry = window.frameGeometry();
    int width = windowFrameGeometry.width();
    int height = windowFrameGeometry.height();
    
  2. minimumSize() and maximumSize()

    • These functions retrieve the minimum and maximum size constraints set for the window using setMinimumSize() and setMaximumSize(). They return QSize objects.
    • Use these to get the allowed resizing range for the window, not the current size.

Choosing the Right Alternative

  • To check the allowed resizing range, use minimumSize() and maximumSize().
  • To get the size that reflects the visible area on the screen, use frameGeometry().
  • If you need both position and size, use geometry().
  • If you only need the current width and height of the window without decorations, size() is the most efficient option.