2013-12-09 34 views
26

Qt kullanarak bazı GUI uygulamaları oluşturdum. GUI uygulamasında basma düğmesi ve radyo düğmesi gibi kontroller var. Uygulamayı çalıştırdığımda, düğmenin içindeki düğmeler ve yazı tipleri normal görünüyor. Ekranın DPI ölçeklendirme boyutunu% 100 ila% 150 veya% 200 arasında değiştirdiğimde, kontrollerin yazı tipi boyutu, çözünürlükten bağımsız olarak kontrol boyutunda (basma düğmesi, radyo düğmesi) daha büyük, ancak kontrol boyutunda değil. Bu nedenle kontrollerin içindeki metin kesildi. lütfen ekli görüntüye bakın.Ekranın DPI ölçeklendirme boyutunu değiştirme Qt uygulamasının yazı tipi boyutu daha büyük hale getirildi

DPI ölçeklendirme boyutu% 100'e ayarlanır Qt uygulama bakış

Qt application look when DPI scaling size set to 100%

DPI ölçeklendirme boyutu

Qt application look when DPI scaling size set to 200%

Ben başvurumu çalıştırıyorum% 200 olarak ayarlanmış Qt uygulama görünüm Bazı tabletler de. Tabletlerde, DPI ölçek değeri% 150'den fazla olmalı, her şey çok küçük gösterilecek.

Çözünürlük ve DPI ölçeği değerinden bağımsız olarak Qt'de UI uygulaması oluşturmak için web'de arama yaptım, ancak şans yok. Bu yüzden benim araştırmamı buraya gönderiyorum. Bundan kurtulmanın bir yolu varsa lütfen bana bildirin.

+0

, bu sorunu ve out sürümü qt5.6 kullanarak herhangi bir çözüm var , lütfen bana yardım edin – lucifer

cevap

7

Düzenleri doğru kullanmak yardımcı olabilir.

http://qt-project.org/doc/qt-4.8/layout.html

beklemediğiniz garip yazı değişiklikleri önler, sen DPI değişikliklerini işlemek OS anlatıyor.

http://msdn.microsoft.com/en-us/library/ms701681(v=vs.85).aspx

kritik yerlerde aralık için, size render yazı tipinin boyutunu kontrol edin ve ardından metnin ortaya çıkan boyutuna göre Nesnenizin minimum boyut ayarlayabilirsiniz.

http://qt-project.org/doc/qt-4.8/qfontmetrics.html#details

https://blog.qt.digia.com/blog/2009/06/26/improving-support-for-higher-dpi-on-vista/

Sen Qt gelen ölçümler inşa diğer danışmadan deneyebilirsiniz: Eğer QML kullanıyorsanız

http://qt-project.org/doc/qt-4.8/qpaintdevice.html#widthMM

http://qt-project.org/doc/qt-4.8/qpaintdevice.html#logicalDpiX

, bozulmamış düzenleri için deneyin sadece çapa tabanlı yerleştirme.

http://qt-project.org/doc/qt-4.8/qml-anchor-layout.html

QApplication şekilde alakalıdır bazı ayarları vardır.

http://qt-project.org/doc/qt-4.8/qapplication.html#setDesktopSettingsAware

elle de yazı tipini belirtebilirsiniz. yardımcı olur

http://qt-project.org/doc/qt-4.8/qapplication.html#setFont

Umut.

+0

Sizin tarafınızdan sağlanan ikinci bağlantı sadece Windows'da çalışacak mı? Bu API'yi QT'de kullanmak mümkün mü? Diğer tüm platformlarda çalışacak mı? – impulse

+0

Evet, bu bir Windows'a özgü olanıdır. Diğer işletim sistemleri için benzer şeyler olabilir ama ben bunların farkında değilim. – phyatt

+0

Windows için derlediğiniz sürece, Windows API çağrılarını kullanabilirsiniz. Pencerenin Windows dışındaki çağrılarını kullanması derlenmez. – phyatt

5

Tüm metin boyutlarını büyütmek için uygulanan Windows erişilebilirlik ayarları içerdiğinde içerdiği tüm metinlere sığacak kadar büyük olmayan sabit boyutlu bir pencerem vardı. Windows bunu dpi ile yapar. Bunu os ölçekleme faktörünü tekrar alarak düzeltdim ve sonra penceremin boyutunu ve bazı düzenlerini (herhangi bir nedenle otomatik olarak ölçeklenemediğim) düzenledim. İşte

("WindowsDpiScale.h" adlı bir dosyada) Ben dpi ölçeği böyle kazandım:

#ifndef WINDOWSDPISCALE_H 
#define WINDOWSDPISCALE_H 

#include <QtGlobal> 

#ifdef Q_OS_WIN 

#include <windows.h> 

const float DEFAULT_DPI = 96.0; 

float windowsDpiScale() 
{ 
    HDC screen = GetDC(0); 
    FLOAT dpiX = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSX)); 
    ReleaseDC(0, screen); 
    return dpiX/DEFAULT_DPI; 
} 

#endif //Q_OS_WIN 

#endif // WINDOWSDPISCALE_H 

Ve sonra, benim durumumda uyguladı nasıl:

... 
#include "WindowsDpiScale.h" 

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
{ 
... 
    // Enlarge the window and various child widgets to accomendate 
    // OS display scaling (i.e. accessibily options) 
    setScaleToOsSettings(); 
... 
} 

void MainWindow::setScaleToOsSettings() 
{ 
#ifdef Q_OS_WIN 
    setScale(windowsDpiScale()); 
#endif 
} 

void MainWindow::setScale(float scale) 
{ 
    // Resize the window 
    this->setFixedSize((int)(scale * this->maximumWidth()), 
         (int)(scale * this->maximumHeight())); 

    // Resize the layouts within the stacked widget 
    foreach(QVBoxLayout * layout, 
      windowUi_->pagerStackedWidget->findChildren<QVBoxLayout *>()) 
     layout->parentWidget()->setFixedSize(
      (int)(scale * layout->parentWidget()->contentsRect().width()), 
      (int)(scale * layout->parentWidget()->contentsRect().height())); 
} 
+0

yardım, ben bu sorun ile ilgili herhangi bir çözüm var ve qt5.6 sürümü kullanarak dışarı, lütfen bana yardım et – lucifer

+0

Çözümü denedin mi? Qt sürümü bağımlı değil. Sadece Windows'dan "ölçekleme faktörü" alır. Sonra widget'larınızı buna göre yeniden boyutlandırmak size kalmış - örneğimde gösterdiğim gibi. – BuvinJ

+1

Linux platformunda çalışıyor mu? Linux platformunda Qt kullanıyorum. – lucifer

13

Yüksek DPI destek Qt 5.6'dan itibaren etkinleştirilmiştir. Uygulama kaynak kodunuzda QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling) ayarı

DİKKAT: Eğer QApplication nesnesi oluşturmadan önce özellik yöntemi kullanmak için, özelliği ayarlamalıdır i aynı sorun var

#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 

    QApplication app(argc, argv); 
    return app.exec(); 
} 
+0

aynı sorunu var, bu sorun ile ilgili herhangi bir çözüm var ve qt5.6 sürümünü kullanarak, lütfen bana yardım edin – lucifer

+0

Bildirimi için teşekkürler! – Stormenet

+0

Mükemmel cevap. – CroCo