2013-12-09 32 views
26

Qtを使用してGUIアプリケーションを作成しました。私のGUIアプリケーションには、プッシュボタンやラジオボタンのようなコントロールが含まれています。アプリケーションを実行すると、ボタン内のボタンとフォントが正常に見えます。ディスプレイのDPIスケーリングサイズを100%から150%または200%に変更すると、解像度に関係なく、コントロールのフォントサイズは大きくなりますが、サイズは制御されません(プッシュボタン、ラジオボタン)。これにより、コントロール内のテキストが途切れてしまいました。添付の画像をご覧ください。ディスプレイのDPIスケーリングサイズを変更するQtアプリケーションのフォントサイズが大きく表示される

DPIスケーリングのサイズを100%に設定のQtアプリケーションのルック

Qt application look when DPI scaling size set to 100%

DPIスケーリングサイズは

Qt application look when DPI scaling size set to 200%

は、私は自分のアプリケーションを実行しています200%に設定するのQtアプリケーションのルックいくつかの錠剤も。タブレットでは、DPIのスケール値は150%以上にする必要があります。そうでなければ、すべてが非常に小さく表示されます。

Qtで解像度とDPIのスケール値に関係なくUIアプリケーションを作成するためにWebで検索しましたが、運がありません。だからここに私の探求を掲示しています。これを取り除く方法があるかどうか私に教えてください。

+0

私は同じ問題を抱えている、あなたはこの問題に関するすべてのソリューションを持っているとアウトでqt5.6バージョンを使用して、助けてください – lucifer

答えて

7

レイアウトを正しく使用すると役立ちます。あなたはDPIを変更扱うOSを告げる

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

、あなたが予想していなかった変なフォントの変更を防ぐことができます。

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

は、重要な場所の間隔のために、あなたはあなたのレンダリングされたフォントのサイズをチェックして、あなたのテキストの結果のサイズに基づいてオブジェクトの最小サイズを設定することができます。

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/

あなたはQtのからの測定値に建てられた他のチェックを試みることができる:

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

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

あなたはQMLを使用している場合は、自然のままのレイアウトにしてみてくださいアンカーベースの配置のみです。

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

QApplication多少関係しているいくつかの設定があります。

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

は、手動でも、フォントを指定することもできます。

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

お役に立てば幸いです。

+0

あなたが提供する2番目のリンクはWindowsでのみ正しく動作しますか? QTでそのAPIを使用することは可能ですか?他のすべてのプラットフォームで動作しますか? – impulse

+0

はい、Windows固有のものです。他のOSにも同様のことがあるかもしれませんが、私はそれらを認識していません。 – phyatt

+0

Windows用にコンパイルしている限り、Windows API呼び出しを使用できます。 Windows以外のウィンドウの呼び出しを使用するとコンパイルされません。 – phyatt

5

固定サイズのウィンドウがありましたが、これは、すべてのテキストサイズを拡大するために適用されたWindowsのアクセシビリティ設定が含まれている場合、それに含まれるすべてのテキストに適合する大きさではありませんでした。 Windowsではdpiを増やしてこれを行います。私はosの倍率をretreivingしてこれを修正し、私のウィンドウのサイズとそのレイアウトのいくつかを調整しました(私は何らかの理由で自動的に拡大縮小できませんでした)。

ここで( "WindowsDpiScale.h" と呼ばれるファイルに)私は、DPIスケールを得た方法は次のとおりです。

#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 

そして、私は私の場合には、それを適用する方法:

... 
#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

私は同じ問題を抱えています。あなたはこの問題に関する解決策を持っています。 – lucifer

+0

私の解決策を試しましたか? Qtのバージョンに依存しません。 Windowsから「スケーリングファクタ」を取得するだけです。私の例で示すように、それに基づいてウィジェットのサイズを変更するのはあなた次第です。 – BuvinJ

+1

Linuxプラットフォームで動作していますか? LinuxプラットフォームでQtを使用します。 – lucifer

13

高いDPI Qt 5.6以降でサポートが有効になります。

QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling)をアプリケーションのソースコードに設定すると、自動的に高DPIスケーリングが可能になります。

注意:属性のメソッドを使用するには、あなたはQApplicationオブジェクトを作成する前に、あなたが属性を設定する必要があります。

#include <QApplication> 

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

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

私は同じ問題を抱えています。あなたはこの問題に関して何か解決策を持っていますし、qt5.6版を使って、助けてください。 – lucifer

+0

通知をありがとう! – Stormenet

+0

完璧な答え。 – CroCo

関連する問題