#include #include #include #include #include #include #include #include class QScaledWidget : public QWidget { public: QScaledWidget() { m_layout = new QVBoxLayout(this); QFrame* frame = new QFrame(); frame->setFrameShape(QFrame::Box); QBoxLayout* frameLayout = new QHBoxLayout(frame); m_label = new QLabel("TEST"); m_square1 = new QFrame(); m_square1->setFrameShape(QFrame::Box); m_square2 = new QFrame(); m_square2->setFrameShape(QFrame::Box); frameLayout->addWidget(m_square1); frameLayout->addWidget(m_label); frameLayout->addWidget(m_square2); m_layout->addWidget(frame); setMetricsWithoutScaling(); } void setMetricsWithoutScaling() { m_layout->setMargin(50); QFont f; f.setPixelSize(50); m_label->setFont(f); m_square1->setFixedSize(40, 40); m_square2->setFixedSize(40, 40); } void updateMetrics() { m_layout->setMargin(m_currentFactor*50); QFont f; f.setPixelSize(m_currentFactor*50); m_label->setFont(f); m_square1->setFixedSize(m_currentFactor*40, m_currentFactor*40); m_square2->setFixedSize(m_currentFactor*40, m_currentFactor*40); } void updateFactor() { QScreen* screen = window()->windowHandle()->screen(); qreal dpr = screen->devicePixelRatio(); qreal pdpi = screen->handle()->logicalDpi().first; qreal factor = pdpi / (dpr * 96.0); if (!qFuzzyCompare(1 + factor, 1 + m_currentFactor)) { m_currentFactor = factor; printf("new factor %f\n", factor); updateMetrics(); } } virtual bool event(QEvent *e) override { if (qApp->arguments().contains("scaled") && e->type() == QEvent::Paint) { updateFactor(); } return QWidget::event(e); } QVBoxLayout* m_layout; QVBoxLayout* m_frameLayout; QLabel* m_label; QFrame* m_square1; QFrame* m_square2; qreal m_currentFactor = 0.0; }; int main(int argc, char *argv[]) { QString appName = "none"; if (argc > 1) { if (argv[1] == std::string("scaled") || argv[1] == std::string("qtscaled")) { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); } else if (argv[1] == std::string("aware")) { SetProcessDPIAware(); QApplication::setAttribute(Qt::AA_DisableHighDpiScaling); } appName = argv[1]; } QApplication a(argc, argv); QScaledWidget widget; widget.setWindowTitle(appName); widget.show(); return a.exec(); }