2011-12-21 16 views
16

I'km lavorare in Qt, ho bisogno di aiuto per ottenere la dimensione fisica dello schermo (monitor),Get dimensione fisica dello schermo in Qt

In Qt si può ottenere una QDesktopWidget da QApplication, voglio dire:

QDesktopWidget *mydesk = QApplication::desktop(); 

il QDesktopwidget ha alcuni metodi per ottenere la risoluzione in pixel e un po 'per ottenere il la dimensione in milimethers:

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

Tuttavia, questo non correspo e alla dimensione fisica, quando misuro il mio schermo con un righello, c'è una differenza considerevole.

Inoltre si può ottenere la misura DPI e calcolare la dimensione dello schermo:

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

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

dove mydesk.width() e mydesk.height() dare (risoluzione)

la dimensione in pixel Tuttavia la misura è anche sbagliato e molto vicino a mydesk.widthMM() e mydesk.heightMM()

Anche io ho navigato mydesk.logicalDpiX() e ha risultati simili.

+0

Tali metodi non hanno mai lavorato per me L'unico modo per ottenere misure reali è fare riferimento a un oggetto del mondo reale sullo schermo (pensa a dimes, righelli, ecc.) –

+0

Ciao Sosukodo, cosa ti ricordi di "riferimento a un oggetto del mondo reale sullo schermo"? grazie – Herman

+0

Ho scritto un'applicazione di esempio ma io ' Comunque, se sai che la dimensione di una monetina è di 17,9 mm e mostri all'utente un'immagine di una moneta da dieci centesimi, allora lasciali ingrandire/rimpicciolire fino a quando l'immagine non corrisponde a quella della moneta da dieci centesimi, in pratica dice: 17,9 mm = N pixel sul mio schermo .. Da quel punto fai semplici calcoli matematici per calcolare quanti ammassi vanno nelle misure dello schermo. –

risposta

8

Ecco il mio esempio (veloce e sporco). Sembra funzionare per me e spero che funzioni per te. Suppongo che tu possa occuparti di main.cpp da solo. Ho fatto questo su un MacBook Air da 11,6" e non sostituiti con una foto di un centesimo per l'icona USA inclusa 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

E 'davvero buono, l'ho usato nel mio netbook, e la mia moneta, e ho ottenuto le dimensioni fisiche, apprezzo molto il tuo aiuto. Ma ho bisogno di un modo per ottenere automaticamente le dimensioni per la mia applicazione. – Herman

+1

Onestamente, non penso sia possibile. Se lo è, mi piacerebbe sapere su quali piattaforme è possibile! Notare la documentazione per QPaintDevice :: widthMM: "A causa delle limitazioni della piattaforma potrebbe non essere possibile utilizzare questa funzione per determinare la dimensione fisica effettiva di un widget sullo schermo." –

Problemi correlati