Question

Je sais qu'il s'agit d'une question très spécifique liée à C ++ et à Qt, mais quelqu'un peut peut-être m'aider, de toute façon ...

Voir le code ci-dessous: Je souhaite afficher une image dans une zone de défilement. Le port de visualisation de la zone de défilement doit avoir une taille initiale définie. Cela signifie que si la taille de l'image est supérieure à la taille initiale du port d'affichage, les barres de défilement seront visibles, sinon ce n'est pas le cas.

// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );

// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );

Il doit être possible de redimensionner l’ensemble de l’application afin que le port d’affichage ait une taille différente de celle du port initial.

Malheureusement, je n’ai pas pu savoir comment régler la taille du port de visualisation. Le mécanisme de présentation de Qt semble définir une taille par défaut pour le port d'affichage, mais je ne pouvais pas le changer jusqu'à présent. Définir une nouvelle taille avec

area->setMinimumSize( QSize( 300, 300 ) );

définira réellement la taille demandée, mais la zone de défilement perdra la possibilité d’être redimensionnée à une taille inférieure à 300x300.

Des idées?

Était-ce utile?

La solution

Je pense que vous envisagez le problème de la mauvaise façon. QScrollArea est simplement un widget que vous insérez dans un cadre ou dans QMainWindow. La taille du widget est contrôlée par la disposition du widget qui le contient.

Jetez un coup d'œil à cet exemple tiré de Trolltech: Visionneuse d'images Exemple

Autres conseils

La zone de défilement est-elle le widget de niveau supérieur? Si oui, appelez simplement

area->resize(300,300);

S'il s'agit d'une hiérarchie, vous devez redimensionner le niveau supérieur de manière appropriée (complexe) ou définir la taille minimumSize de la zone. Vous pouvez également essayer d'expérimenter LayoutPolicy - en supposant que sizeHint est QSize (300 300), vous pouvez lui attribuer la stratégie de taille appropriée en fonction de ce qui est défini dans https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

Vous pouvez essayer:

class MyScrollArea : public QScrollArea
{
    virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};

// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );

Cependant, la mise en page et Qt sont incroyablement vaudous. C’est l’OMI, sa partie la moins fonctionnelle.

si cela ne fonctionne pas, essayez d'appeler QWidget :: resize () sur différents widgets.

Je ne pense pas que vous puissiez faire cela très facilement, c'est-à-dire (si je le lis correctement), redimensionnez le widget de manière à ce que la zone interne mesure 300 x 300. Cependant, vous pourriez peut-être la modifier, car une zone de défilement est un type de cadre qui hérite de QWidget. Cela signifie que vous pouvez simplement appeler area- > resize (300 + fudge, 300 + fudge) , où vos valeurs de fudge représentent le bit supplémentaire pris en compte par le dessin du cadre.

Je ne suis cependant pas sûr que cela fonctionnerait dans un dialogue redimensionnable dynamiquement. Je n'ai jamais rien fait de tel.

Si vous essayez d'afficher une image à l'intérieur d'une zone de défilement, le mieux est de ne pas utiliser d'étiquette.

Vous devriez essayer d’utiliser un QGraphicsView / QGraphicsScene / QGraphicPixmapItem (au lieu de la zone de défilement et de l’étiquette). Les performances sont bien meilleures lors de l'affichage d'images. La zone de défilement et l'étiquette redessineront très mal l'image lorsque vous vous déplacerez à l'aide des barres de défilement.

Par exemple, vous avez un " fichier .ui " fichier avec un QGraphicsView sur l'interface graphique appelé "qgvImageView" et une image QImage appelée "image" ...

QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);

Consultez la documentation QT. BTW: Cela a été introduit dans Qt 4.2

Je ne sais pas si cela résoudra spécifiquement le problème, mais il est possible que QGraphicsView réagisse mieux à ce que vous essayez de faire.

Que diriez-vous d'utiliser

area->setGeometry(int x, int y, int w, int h);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top