2017-02-26 3 views
0

私はQt 5.7のQGraphicsViewに表示したい背景イメージを持っています。スクロールする必要なしに、ウィンドウのサイズが画面全体を正確に覆うようなサイズにしたいと思います。だから、私はそれがWindowsのタスクバーとUbuntuの上パネルと左パネルのスペースを確保したいと思っています(私はUbuntu 14.04を使用しています)。QDesktopWidget available Qtのジオメトリ()が正常に動作しない、完全な画像を表示するために垂直にスクロールする必要がある

Qtのドキュメントから、QDesktopWidget::availableGeometry()がこの目的で使用する関数であることがわかりました。これはStackOverflow herehereで繰り返されています。

ただし、これを使用しようとすると、スクロールバーのポリシーをQt::ScrollBarAlwaysOffに設定すると画像の一部が途切れることがわかります。スクロールバーのポリシーを垂直に少しスクロールする必要があります。

ここ小さなサンプルコードは次のとおり

#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QApplication> 
#include <QImage> 
#include <QBrush> 
#include <QDebug> 
#include <QDesktopWidget> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QGraphicsScene *scene = new QGraphicsScene; 
    QGraphicsView *view = new QGraphicsView; 
    view->setScene(scene); 
    QRect rec = QApplication::desktop()->availableGeometry(); 
    int screenHeight = rec.height(); 
    int screenWidth = rec.width(); 
    QImage *back = new QImage("image.jpg"); 
    QImage *background = new QImage(back->scaled(screenWidth,screenHeight,Qt::KeepAspectRatio,Qt::FastTransformation)); 
    QBrush *brush = new QBrush(*background); 
    view->setBackgroundBrush(*brush); 
// view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
// view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    view->setFixedSize(screenWidth,screenHeight); 
    view->setSceneRect(0,0,screenWidth,screenHeight); 
    view->show(); 

    return a.exec(); 
} 

マイ画面解像度を1366x768ピクセルであるので、私はそのサイズの画像を使用し、表示する前QImage::scaled()関数を使用してスケーリングされています。例えば

、入力された場合: input image 画像の帰属:Mirela12341366x768-Natural-desktop-wallpaperCC BY-SA 4.0

私は上記のコードを実行すると、私が手: result (Iから上部と左側のパネルをトリミングしていますスクリーン)。

どうしてですか? availableGeometry()は、タイトルバーを説明していませんか?どうすれば修正できますか?

ありがとうございます。

答えて

1

availableGeometry()は完全に正しい動作します:)

問題は、アカウントのフレームサイズを考慮していないということです。画像を最大availableGeometryにリサイズしますが、ウィンドウの枠もいくらかかかります。最後に、イメージが大きくなり、ウィジェットに空き領域ができます。それがスクロールバーを持っている理由です。あなたは何ができるか

は、例えば次のとおりです。

// 2 - because frame border is on the bottom and on the top. 
QImage *background = new QImage(back->scaledToHeight(rec.height() - view->frameWidth() * 2)); 

う作品。

関連する問題