2017-02-26 1 views
0

J'ai une image de fond que je voudrais afficher dans un QGraphicsView dans Qt 5.7. Je voudrais que la taille de la fenêtre soit telle qu'elle couvre exactement tout mon écran, sans avoir besoin de faire défiler. Donc, je voudrais m'assurer qu'il laisse de l'espace pour la barre des tâches dans Windows et les panneaux supérieur et gauche dans Ubuntu (j'utilise Ubuntu 14.04).QDesktopWidget disponibleGeometry() dans Qt ne fonctionne pas correctement, besoin de faire défiler verticalement pour voir l'image complète

J'ai trouvé dans la documentation Qt que QDesktopWidget::availableGeometry() est la fonction à utiliser à cet effet. Cela a été réitéré dans StackOverflow here et here.

Cependant, quand j'essaie d'utiliser ceci, j'observe qu'une petite partie de l'image est coupée, si je règle la politique de barre de défilement à Qt::ScrollBarAlwaysOff, et sinon, je dois faire défiler légèrement verticalement.

Voici un petit exemple de code:

#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(); 
} 

Ma résolution d'écran est 1366x768 pixels, donc j'ai utilisé une image de cette taille, et mis à l'échelle en utilisant la fonction QImage::scaled() avant d'afficher.

Par exemple, si l'entrée est: input image image Attribution: Mirela1234, 1366x768-Natural-desktop-wallpaper, CC BY-SA 4.0

Quand je lance le code ci-dessus, je reçois: result (j'ai recadré les panneaux haut et à gauche de l'écran).

Pourquoi cela se produit-il? Est-ce que availableGeometry() ne tient pas compte, disons, de la barre de titre? Comment puis-je corriger cela?

Merci.

Répondre

1

availableGeometry() fonctionne parfaitement correct :)

Le problème est que vous ne prenez pas dans la taille du cadre de compte. Vous redimensionnez l'image au maximum disponible, mais le cadre de la fenêtre prend aussi un peu de place. À la fin, vous avez une image plus grande, puis de l'espace libre sur le widget. C'est pourquoi vous avez une barre de défilement.

Ce que vous pouvez faire est par exemple:

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

qui fonctionne.