2011-12-21 13 views
16

I'km pracę w Qt, i potrzebują pomocy, aby uzyskać fizyczny rozmiar ekranu (monitora),Get fizyczny rozmiar ekranu w Qt

W Qt można uzyskać QDesktopWidget z QApplication, to znaczy:

QDesktopWidget *mydesk = QApplication::desktop(); 

QDesktopwidget ma kilka metod, aby uzyskać rozdzielczość w pikselach, a niektóre, aby uzyskać rozmiar w milimethers:

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

jednak to nie correspo Do fizycznego rozmiaru, kiedy mierzę mój ekran linijką, jest znaczna różnica.

Również można uzyskać pomiar DPI i obliczyć wielkość ekranu:

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

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

gdzie mydesk.width() i mydesk.height() podać rozmiar w pikselach (rozdzielczość)

Jednak jest pomiar również źle i bardzo blisko mydesk.widthMM() i mydesk.heightMM()

Mam również triyed mydesk.logicalDpiX() i ma podobne wyniki.

+0

tych metod nie pracowali dla mnie Jedynym sposobem na uzyskanie realnych pomiarów odwołać obiekt rzeczywisty na ekranie (myślniki, linijki, itp.) –

+0

Cześć Sosukodo, co myślisz o "odniesieniu do rzeczywistego obiektu na ekranie"? dzięki – Herman

+0

Piszę przykładową aplikację, ale ja ' Nie zrobiłem tego. W każdym razie, jeśli wiesz, że rozmiar bilonu to 17,9 mm, a Ty pokazujesz użytkownikowi obraz dziesięciocentów, to pozwól im powiększać/pomniejszać, aż obraz pasuje do fizycznego bilonu, w zasadzie mówi: 17,9 mm = N pikseli na moim ekranie. Z tego możesz wykonać prostą matematykę, aby obliczyć, ile dziesięciocentów trafia do twoich ekranów. –

Odpowiedz

8

Oto mój (szybki i brudny) przykład. Wydaje się, że działa to dla mnie i mam nadzieję, że to działa dla ciebie. Zakładam, że sam możesz zająć się main.cpp. Zrobiłem to na MacBook Air 11,6" oraz podstawiony obraz bilon na ikonie USA dołączony 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

Jest naprawdę dobry, użyłem go w moim netbooku i na mojej własnej monecie, ale mam fizyczny rozmiar, naprawdę doceniam twoją pomoc. Ale potrzebuję sposobu, aby automatycznie pobrać rozmiar dla mojej aplikacji. – Herman

+1

Szczerze mówiąc, nie sądzę, że to możliwe. Jeśli tak, chciałbym wiedzieć, na jakich platformach jest to możliwe! Zwróć uwagę na dokumentację QPaintDevice :: widthMM: "Ze względu na ograniczenia platformy może nie być możliwe użycie tej funkcji do ustalenia rzeczywistego fizycznego rozmiaru widgetu na ekranie." –