2008-10-27 5 views
3

Je sais que c'est une question très spécifique liée à C++ et Qt, mais peut-être que quelqu'un peut m'aider, de toute façon ...Comment définir la taille initiale d'un QScrollArea?

Voir le code ci-dessous: Je veux afficher une image dans une zone de défilement. Le port d'affichage 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, elles ne le seront pas.

// 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 est possible de redimensionner l'ensemble de l'application de sorte que le port de vue aura une autre taille que celle initiale. Malheureusement, je n'ai pas été en mesure de savoir comment définir la taille du port de vue. Le mécanisme de mise en page de Qt semble définir une taille par défaut pour le port d'affichage, mais jusqu'à présent, je n'ai pas été capable de le changer. Définition d'une nouvelle taille avec

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

va mettre effectivement la taille demandée, mais la zone de défilement desserre la possibilité de se redimensionnées à une taille plus petite que 300x300.

Des idées?

Répondre

2

Je pense que vous regardez le problème dans le mauvais sens. Le QScrollArea est juste un widget que vous mettez dans un cadre ou QMainWindow. La taille du widget est contrôlée par la disposition du widget qui le contient.

Jetez un oeil à cet exemple de Trolltech: Image Viewer Example

0

Je ne pense pas que vous pouvez faire exactement cela très facilement, ce qui est (si je lis correctement), la taille du widget de sorte que la zone interne est de 300x300. Cependant, vous pourriez être en mesure de le contourner 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 par le dessin du cadre.

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

1

Vous pouvez:

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 est incroyablement Voodoo. C'est l'OMI, sa partie la moins fonctionnelle.

Si cela ne fonctionne pas, essayez d'appeler QWidget :: resize() sur divers widgets.

0

Si vous essayez d'afficher une image dans une zone de défilement, votre meilleur pari ne va pas avec une étiquette.

Vous devriez essayer d'utiliser QGraphicsView/QGraphicsScene/QGraphicPixmapItem (au lieu de la zone de défilement et de l'étiquette). La performance est bien meilleure lors de l'affichage des images. La zone de défilement et l'étiquette vont redessiner l'image très mal lorsque vous vous déplacez en utilisant les barres de défilement.

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

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

Vérifiez la Documentation QT. BTW: Cela a été introduit dans Qt 4.2

Je ne sais pas si cela va résoudre le problème, mais il est possible que QGraphicsView réagisse mieux à ce que vous essayez de faire. La zone de défilement est-elle le widget de niveau supérieur?

2

Dans ce cas, il suffit d'appeler

area->resize(300,300); 

Si c'est à l'intérieur d'une hiérarchie dont vous avez besoin pour redimensionner la toplevel appropriée (complexe), ou définir la minimumSize de la région. Vous pouvez également essayer d'expérimenter avec le LayoutPolicy - en supposant que le sizeHint est QSize (300300), vous pouvez le donner à la politique de taille appropriée en fonction de ce qui est défini dans http://doc.trolltech.com/4.4/qsizepolicy.html#Policy-enum

0

Comment l'utilisation

area->setGeometry(int x, int y, int w, int h); 
Questions connexes