Working with Page Sizes in Qt: Alternatives to QPageSize::sizePoints()


Purpose

  • Points are a common unit for measuring sizes in printing and graphical user interfaces (GUIs).
  • The QPageSize::sizePoints() function in Qt GUI retrieves the size of a page in points (72 points per inch).

Usage

  • There are two main ways to use sizePoints():
    1. With a PageSizeId
      • If you know the standard page size identifier (PageSizeId), you can call sizePoints(PageSizeId). This will return a QSizeF object representing the width and height of the page in points.
      • Standard page sizes include A4, Letter, Legal, etc. You can find a list of available PageSizeId values in the Qt documentation.
    2. Without a PageSizeId
      • If you don't have a PageSizeId, you can call sizePoints() without any arguments. However, this will return the size of the default page size, which is typically system-dependent (often Letter on Windows).

Example

#include <QPageSize>
#include <QDebug>

int main() {
  // Get the size of A4 page in points
  QPageSize a4Page(QPageSize::A4);
  QSizeF a4Size = a4Page.sizePoints();
  qDebug() << "A4 size (points):" << a4Size;

  // Get the default page size (system-dependent) in points
  QPageSize defaultPage;
  QSizeF defaultSize = defaultPage.sizePoints();
  qDebug() << "Default page size (points):" << defaultSize;

  return 0;
}

Important Considerations

  • If you're working with pixel sizes for screen elements, you might consider using QPageSize::size() or QPageSize::sizePixels(). These functions allow you to specify the desired unit (e.g., millimeters, inches) or use the device's pixel resolution.
  • QPageSize::sizePoints() is primarily for working with page sizes in a printing context or when dealing with point-based layouts.
  • The QPageSize class provides various other functions for manipulating and querying page sizes, including:
    • definitionSize(): Returns the page size based on its internal definition (might not be the exact points for standard sizes).
    • definitionUnits(): Returns the unit used for the definition size.
    • id(): Gets the PageSizeId for a given size and unit.
    • name(): Returns the descriptive name of a page size (e.g., "A4").
    • rect(): Creates a QRectF representing the page rectangle in the specified unit.
    • And more.


Using sizePoints() with different PageSizeIds

#include <QPageSize>
#include <QDebug>

int main() {
  // Get sizes of A4, Letter, and Legal pages in points
  QPageSize a4Page(QPageSize::A4);
  QSizeF a4Size = a4Page.sizePoints();
  qDebug() << "A4 size (points):" << a4Size;

  QPageSize letterPage(QPageSize::Letter);
  QSizeF letterSize = letterPage.sizePoints();
  qDebug() << "Letter size (points):" << letterSize;

  QPageSize legalPage(QPageSize::Legal);
  QSizeF legalSize = legalPage.sizePoints();
  qDebug() << "Legal size (points):" << legalSize;

  return 0;
}

Using size() and sizePixels() for different units

#include <QPageSize>
#include <QDebug>

int main() {
  QPageSize a4Page(QPageSize::A4);

  // Get size in millimeters
  QSizeF a4Millimeters = a4Page.size(QPageSize::Millimeter);
  qDebug() << "A4 size (millimeters):" << a4Millimeters;

  // Get size in inches (assuming device resolution of 300 DPI)
  QPageSize letterPage(QPageSize::Letter);
  QSize letterInches = letterPage.size(QPageSize::Inch, 300);
  qDebug() << "Letter size (inches, 300 DPI):" << letterInches;

  // Get size in pixels (system-dependent resolution)
  QPageSize legalPage(QPageSize::Legal);
  QSize legalPixels = legalPage.sizePixels();
  qDebug() << "Legal size (pixels):" << legalPixels;

  return 0;
}

Using definitionSize() and definitionUnits()

#include <QPageSize>
#include <QDebug>

int main() {
  QPageSize customPage(QSizeF(612, 792), QPageSize::Millimeter);  // Custom size in mm

  // Get the internal definition (might not be exact points for standard sizes)
  QSizeF customDefinitionSize = customPage.definitionSize();
  qDebug() << "Custom page definition size:" << customDefinitionSize;

  // Get the unit used for the definition
  QPageSize::Unit customUnit = customPage.definitionUnits();
  qDebug() << "Custom page definition unit:" << (customUnit == QPageSize::Millimeter ? "Millimeter" : "Unknown");

  return 0;
}
#include <QPageSize>
#include <QDebug>

int main() {
  QPageSize a4Page(QPageSize::A4);

  // Get the PageSizeId for A4
  QPageSize::PageSizeId a4Id = a4Page.id();
  qDebug() << "A4 page ID:" << a4Id;

  // Get the descriptive name of A4
  QString a4Name = a4Page.name();
  qDebug() << "A4 page name:" << a4Name;

  // Get the rectangle representing A4 page (in points)
  QRectF a4Rect = a4Page.rect();
  qDebug() << "A4 page rectangle (points):" << a4Rect;

  return 0;
}


Using QPageSize::size()

  • If you need the page size in a unit other than points, you can use QPageSize::size(). This function takes an optional second argument specifying the desired unit:
    • QPageSize::Millimeter
    • QPageSize::Inch
    • QPageSize::Centimeter
    • And more (refer to Qt documentation for all available units).
QPageSize a4Page(QPageSize::A4);

// Get size in millimeters
QSizeF a4Millimeters = a4Page.size(QPageSize::Millimeter);

Using QPageSize::sizePixels()

  • If you specifically need the page size in pixels, use QPageSize::sizePixels(). This function considers the device's pixel resolution to provide an approximation of the page size in pixels.
QPageSize legalPage(QPageSize::Legal);

// Get size in pixels (system-dependent resolution)
QSize legalPixels = legalPage.sizePixels();

Manual Calculations (if applicable)

  • In some cases, you might know the standard page size dimensions (e.g., A4: 210 x 297 mm) and the device's pixel resolution. You can then manually calculate the pixel size using:
int widthInPixels = (int)(standardWidthInMillimeters * resolution / 1000.0);
int heightInPixels = (int)(standardHeightInMillimeters * resolution / 1000.0);

Choosing the Right Alternative

The best alternative depends on your specific use case:

  • For very specific scenarios where you have additional information, manual calculations might be an option.
  • If you need the pixel representation for screen elements, consider QPageSize::sizePixels().
  • If you work with different units (millimeters, inches), use QPageSize::size().
  • If you need the size in points for printing or point-based layouts, QPageSize::sizePoints() remains the most suitable choice.