Domanda

So che questa è una domanda molto specifica su C ++ e Qt, ma forse qualcuno mi può aiutare, comunque ...

Vedi il codice qui sotto: voglio visualizzare un'immagine all'interno di un'area di scorrimento. La porta di visualizzazione dell'area di scorrimento deve avere una dimensione iniziale definita. Ciò significa che se la dimensione dell'immagine è maggiore della dimensione iniziale della porta di visualizzazione, le barre di scorrimento saranno visibili, altrimenti no.

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

Dovrà essere possibile ridimensionare l'intera applicazione in modo che la porta di visualizzazione abbia dimensioni diverse da quella iniziale.

Sfortunatamente non sono stato in grado di scoprire come impostare la dimensione della porta di visualizzazione. Il meccanismo di layout di Qt sembra impostare una dimensione predefinita per la porta di visualizzazione, ma finora non sono stato in grado di cambiarlo. Impostare una nuova dimensione con

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

imposterà effettivamente la dimensione richiesta, ma poi l'area di scorrimento perde la possibilità di ridimensionare a una dimensione inferiore a 300x300.

Qualche idea?

È stato utile?

Soluzione

Penso che tu stia guardando il problema nel modo sbagliato. QScrollArea è solo un widget inserito in un frame o QMainWindow. La dimensione del widget è controllata dal layout del widget che lo contiene.

Dai un'occhiata a questo esempio di Trolltech: Visualizzatore immagini esempio

Altri suggerimenti

L'area di scorrimento è il widget di livello superiore? In tal caso, chiama semplicemente

area->resize(300,300);

Se si trova all'interno di una gerarchia, è necessario ridimensionare il livello superiore in modo appropriato (complesso) o impostare la dimensione minima dell'area. Potresti anche provare a sperimentare LayoutPolicy - supponendo che sizeHint sia QSize (300.300) puoi dargli la politica di dimensione appropriata in base a quanto definito in https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

Puoi provare:

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

Comunque layout e Qt sono incredibilmente Voodoo. È la parte meno funzionale dell'IMO.

se non funziona, prova a chiamare QWidget :: resize () su vari widget.

Non credo che si possa fare esattamente così facilmente, che è (se sto leggendo correttamente), ridimensionare il widget in modo che l'area interna sia 300x300. Potresti riuscire a sfumarlo, tuttavia, poiché un'area di scorrimento è un tipo di frame, che eredita da QWidget. Questo significa che potresti semplicemente chiamare area- > resize (300 + fudge, 300 + fudge) , dove i tuoi valori di fudge rappresentano il bit extra occupato dal disegno del frame.

Non sono sicuro che funzionerebbe in una finestra di dialogo ridimensionabile dinamicamente, comunque. Non ho mai fatto niente del genere.

Se stai provando a visualizzare un'immagine all'interno di un'area di scorrimento, la tua scommessa migliore non sta andando con un'etichetta.

Dovresti provare a usare un QGraphicsView / QGraphicsScene / QGraphicPixmapItem (anziché l'area di scorrimento e l'etichetta). Le prestazioni sono molto migliori quando si visualizzano le immagini. L'area di scorrimento e l'etichetta ridisegneranno l'immagine molto male mentre ti muovi usando le barre di scorrimento.

Ad esempio, hai un " .ui " file con un QGraphicsView sulla gui chiamata " qgvImageView " e una QImage chiamata " image " ...

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

Consulta la documentazione di QT. A proposito: questo è stato introdotto in Qt 4.2

Non sono sicuro se questo risolverà specificamente il problema, ma c'è una possibilità che QGraphicsView reagisca meglio a ciò che stai cercando di fare.

Che ne dici di usare

area->setGeometry(int x, int y, int w, int h);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top