OpenGLラッパーライブラリ(OpenSceneGraph)を統合したQOpenGLWidget
を使用する最小限のアプリケーションがあります。私は使用しているようにOpenGLコンテンツを扱う際に、高DPI画面のQt5.6サポートを正しく使う方法を見つけようとしています。Qt5.6:高DPIサポートとOpenGL(OpenSceneGraph)
int main(int argc, char** argv)
{
// DPI support is on
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QMainWindow window;
// QOpenGLWidget with OpenSceneGraph content
QtOSGWidget* widget = new QtOSGWidget();
window.setCentralWidget(widget);
window.show();
return app.exec();
}
QtOSGWidget
はOpenSceneGraphのコンテンツにQOpenGLWidget
から派生されています:私は私の簡単なシーンをレンダリングするためにosgViewer::GraphicsWindowEmbedded
を使用
私main()
機能は、次のコードを持っています。
OSGをQtとマージするには、*GL()
メソッドをpaintGL()
,resizeGL()
、initializeGL()
のように再定義します。私はすなわち、*GL()
の各方法が含まれている必要がありますどのようにQtのドキュメントに従ってください。:
paintGL()
必ずビューアがresizeGL()
は、グラフィックウィンドウを(一緒にカメラとビューポートで)適切にリサイズされているか確認します更新されます。initializeGL()
は、OpenGLの状態が初期化されていることを確認します。- Iも再定義されたQtのマウスイベントOSG に
をイベントを渡すように、私は、通常の解像度の画面上で、またはQApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
と私の例を実行すると、それが必要のように、シーンが見えます:
また、カメラビューを操作すると、マウス座標が正しく取得されます。
私は上の高DPIのオプションを設定するときしかし、これは私が得るものです:
イベントも同様にスケーリングされ、正しくOpenSceneGraphのイベントハンドラに渡されていないために、マウスの座標。
ご覧のとおり、グラフィックスウィンドウのサイズはQtでスケーリングされません。これはおそらく私がサイジングをどのようにセットアップするかの理由によるものです。
virtual void resizeGL(int width, int height)
{
// resize event is passed to OSG
this->getEventQueue()->windowResize(this->x(), this->y(), width, height);
// graphics window resize
m_graphicsWindow->resized(this->x(), this->y(), width, height);
// camera viewport
osg::Camera* camera = m_viewer->getCamera();
camera->setViewport(0, 0, this->width(), this->height());
}
サイジングはQtでスケールされていません。マウスイベントの座標にも同じことが起こります。
私の質問:resizeGL()
を正しく行うために、どのサイズのスケーリングが行われるかを知る方法はありますか?あるいは、問題に対処する正しい方法は何ですか?
@AlexanderVXの回答のおかげで、手動でスケーリングを使用した更新/解決:スケーリングの解決策を理解しました。まず、XとYの次元でDPIのいくつかの基準値を知る必要があります。次に、それに基づいてスケーリング座標を計算し、私のウィジェットQtOSGWidget
に渡します。だから、main()
のコードが含まれています
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
int x = QApplication::desktop()->physicalDpiX();
int y = QApplication::desktop()->physicalDpiY();
// values 284 and 285 are the reference values
double scaleX = 284.0/double(x);
double scaleY = 285.0/double(y);
QMainWindow window;
QtOSGWidget* widget = new QtOSGWidget(scaleX, scaleY, &window);
// etc.
をその後、私はOpenSceneGraph(OpenGLの)コンテンツに渡されるために必要なサイジング機能を参照するたびに、私は例えば、スケーリングを行う必要がある。
// resizeGL example
this->getEventQueue()->windowResize(this->x()*m_scaleX, this->y() * m_scaleY, width*m_scaleX, height*m_scaleY);
// mouse event example
this->getEventQueue()->mouseButtonPress(event->x()*m_scaleX, event->y()*m_scaleY, button);
最終更新:私のアプリケーションのターゲットプラットフォームは、Windows 7から10であることから、それはSetProcessDPIAware()
機能を使用するために、すなわち、@AlexanderVの提案答(第二部)に固執するより多くの意味があります。
ウィンドウのサイズを変更するときにresizeメソッドが呼び出されますか? – KimKulling
はい、私はそれを確認しました。毎回自動的に呼び出されます。 – vicrucann