2011-12-21 15 views
16

I'km trabajando en Qt, necesito ayuda para obtener el tamaño físico de la pantalla (monitor),Obtener tamaño de la pantalla física en Qt

En Qt se puede obtener una QDesktopWidget de QApplication, quiero decir:

QDesktopWidget *mydesk = QApplication::desktop(); 

el QDesktopwidget tiene algunos métodos para obtener la resolución en píxeles y otros para obtener el tamaño de milimethers:

mydesk-> widthMM(); mydesk->heightMM(); 

sin embargo, esto no correspo nd al tamaño físico, cuando mido mi pantalla con una regla, hay una diferencia considerable.

También se puede obtener la medición DPI y calcular el tamaño de la pantalla:

mydesk->physicalDpiX(); mydesk->physicalDpiY(); 

double Winches = (double)mydesk.width()/(double)mydesk.physicalDpiX(); 
double Hinches = (double)mydesk.Height()/(double)mydesk.physicalDpiY(); 

donde mydesk.width() y mydesk.height() dará el tamaño en píxeles (resolución)

Sin embargo, la medición también es malo y muy cerca de mydesk.widthMM() y mydesk.heightMM()

También he triyed mydesk.logicalDpiX() y tiene resultados similares.

+0

Esos métodos no han funcionado para mí la única manera de obtener mediciones reales es hacer referencia a una objeto del mundo real en la pantalla (piense en moneda de diez centavos, reglas, etc.) –

+0

Hola Sosukodo, ¿a qué te refieres con "referencia de un objeto del mundo real en la pantalla"? Gracias – Herman

+0

He estado escribiendo una aplicación de muestra, pero yo ' De todas formas, si sabes que el tamaño de una moneda de diez centavos es de 17.9 mm y le muestra al usuario una imagen de una moneda de diez centavos, entonces permite que se acerque o aleje hasta que la imagen coincida con la moneda de diez centavos, básicamente dice: 17.9 mm = N píxeles en mi pantalla. A partir de eso, usted hace cálculos simples para calcular cuántas monedas de diez va a las medidas de su pantalla. –

Respuesta

8

Aquí está mi ejemplo (rápido y sucio). Parece que funciona para mí y espero que funcione para usted. Supongo que puedes encargarte de main.cpp por tu cuenta. Hice esto en un MacBook Air de 11,6" y no sustituidos con un cuadro de una moneda de diez centavos para el icono de EE.UU. incluye con OS X:.

#ifndef WINDOW_H 
#define WINDOW_H 

#include <QtGui> 

class Window : public QWidget 
{ 
    Q_OBJECT 

public: 
    QWidget *canvas; 
    QSlider *slider; 
    QPixmap pixmap; 

private: 
    qreal zoom; 
    qreal pixels; 
    qreal px_width; 
    qreal px_height; 
    qreal mm_width; 
    qreal mm_height; 

public: 
    Window(); 
    void paintEvent(QPaintEvent *); 

public slots: 
    void setZoom(int); 
}; 

Window::Window() 
{ 
    QHBoxLayout *layout = new QHBoxLayout; 

    canvas = new QWidget; 
    slider = new QSlider; 
    slider->setMinimum(0); 
    slider->setMaximum(100); 
    slider->setValue(50); 

    layout->addWidget(canvas); 
    layout->addWidget(slider); 

    this->setLayout(layout); 

    if(!pixmap.load(":/resources/USA.gif")) 
    { 
     qDebug() << "Fatal error: Unable to load image"; 
     exit(1); 
    } 

    QObject::connect(slider, SIGNAL(valueChanged(int)), SLOT(setZoom(int))); 
} 

void Window::paintEvent(QPaintEvent *event) 
{ 
    QPainter paint; 
    paint.begin(this); 
    paint.scale(zoom, zoom); 
    paint.drawPixmap(0,0, pixmap); 
    paint.end(); 
} 

void Window::setZoom(int new_zoom) 
{ 
    zoom = (qreal)(50+new_zoom) /50; 
    pixels = pixmap.width() * zoom; 

    QDesktopWidget desk; 

    px_width = desk.width()/pixels; 
    px_height = desk.height()/pixels; 
    mm_width = px_width * 17.9; 
    mm_height = px_height * 17.9; 

    qDebug() << "Zoom: " << zoom; 
    qDebug() << "desk.widthMM:" << desk.widthMM(); 
    qDebug() << "px_width: " << px_width; 
    qDebug() << "px_height: " << px_height; 
    qDebug() << "mm_width: " << mm_width; 
    qDebug() << "mm_height: " << mm_height; 

    this->repaint(); 
} 

#include "moc_window.cpp" 

#endif // WINDOW_H 
+1

Es realmente bueno, lo he usado en mi netbook, y mi propia moneda, y obtuve el tamaño físico, realmente aprecio tu ayuda. Pero necesito una forma de obtener el tamaño automáticamente para mi aplicación. – Herman

+1

Honestamente, no creo que sea posible. Si es así, ¡me encantaría saber en qué plataformas es posible! Tenga en cuenta la documentación para QPaintDevice :: widthMM: "Debido a las limitaciones de la plataforma, puede que no sea posible utilizar esta función para determinar el tamaño físico real de un widget en la pantalla". –

Cuestiones relacionadas