Frage

Ich weiß, dass dies eine sehr spezifische C ++ und Qt verwandte Frage, aber vielleicht kann mir jemand helfen, irgendwie ...

Sehen Sie den Code unten: Ich möchte in einem Scroll-Bereich um ein Bild anzuzeigen. Die Sichtöffnung des Scroll-Bereich eine definierte Anfangsgröße haben. Das heißt, wenn die Größe des Bildes ist größer als die ursprüngliche Größe der Sichtöffnung, Bildlaufleisten sichtbar sein, sonst nicht.

// 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 ) );

Es muss möglich sein, die gesamte Anwendung, um die Größe, so dass die Sichtöffnung wird eine andere Größe als die anfänglichen eine.

Leider war ich nicht in der Lage, herauszufinden, wie die Größe der Sichtöffnung einzustellen. Qt-Layout-Mechanismus scheint eine Standardgröße für die Sichtöffnung zu setzen, aber bis jetzt war ich nicht in der Lage, es zu ändern. Einstellen eine neue Größe mit

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

wird die geforderte Größe tatsächlich eingestellt, aber dann der Scroll-Bereich verliert die Fähigkeit, auf eine Größe kleiner als 300x300 verkleinert werden.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich denke, dass man auf das Problem der falsche Weg suchen. Die QScrollArea ist nur ein Widget, das Sie in einem Rahmen oder QMainWindow setzen. Die Größe des Widgets durch das Layout des Widgets gesteuert wird, die es enthält.

Werfen Sie einen Blick auf dieses Beispiel von Trolltech: Image Viewer Beispiel

Andere Tipps

Ist der Scroll-Bereich der Top-Level-Widget? Wenn ja, rufen Sie einfach

area->resize(300,300);

Wenn es innerhalb einer Hierarchie ist, müssen Sie die Top-Level angemessen, um die Größe (Komplex), oder stellen Sie den MinimumSize- der Gegend. Sie können auch mit dem LayoutPolicy zu experimentieren versuchen - das sizeHint unter der Annahme WGröße (300.300) Sie ihm die passende Größe Politik nach geben können, was in definiert ist https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

Sie können versuchen:

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 );

Allerdings Layout und Qt ist erstaunlich Voodoo. Es ist IMO sein dest Funktionsteil.

Wenn das nicht funktioniert, versuchen QWidget Aufruf :: Größe ändern () auf verschiedene Widgets.

Ich glaube nicht, dass Sie genau das tun können, dass es sehr leicht, das ist (wenn ich mich richtig zu lesen), Größe des Widgets, so dass der innere Bereich 300x300 ist. Sie könnten in der Lage sein, es zu fälschen, da jedoch ein Scroll-Bereich eine Art von Rahmen, die von QWidget erbt. Dies bedeutet, dass Sie nur area->resize( 300 + fudge, 300 + fudge ) nennen könnten, wo Ihr Fudge Werte für die Extra-Konto durch den Rahmen der Zeichnung aufgenommen.

Ich bin mir nicht sicher, dass dies in einem dynamisch veränderbaren Dialog funktionieren würde, aber. Ich habe überhaupt nichts Vergleichbares getan.

Wenn Sie versuchen, ein Bild in einem Scroll-Bereich angezeigt werden, Ihre beste Wette wird nicht mit einem Etikett.

Sie sollten versuchen, eine QGraphicsView / QGraphicsScene / QGraphicPixmapItem (anstelle der Scroll-Bereich und Label) verwendet wird. Die Leistung ist viel besser, wenn Bilder angezeigt werden. Der Scroll-Bereich und Label werden das Bild neu zeichnen sehr schlecht, wie Sie die Bildlaufleisten bewegen werden.

Zum Beispiel haben Sie eine „.ui“ Datei mit einem QGraphicsView auf dem GUI namens ‚qgvImageView‘ und ein QImage namens ‚Bild‘ ...

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

Überprüfen Sie die QT-Dokumentation aus. BTW: Dies wurde in Qt 4.2 eingeführt

Ich bin mir nicht sicher, ob dies wird speziell das Problem beheben, aber es gibt eine Chance, dass die QGraphicsView besser reagieren, was Sie zu tun versuchen.

Wie wäre es mit

area->setGeometry(int x, int y, int w, int h);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top