2012-05-25 11 views
11

Ho un widget personalizzato QTextEdit che ha il proprio grip di ridimensionamento nell'angolo. Posso ridimensionare bene il widget di testo, tuttavia il layout all'interno non cambia con il ridimensionamento della modifica del testo.Come forzare l'aggiornamento/ridimensionamento del layout quando il bambino che gestisce viene ridimensionato?

C'è un modo per dire al layout di gestione di ricalcolare se stesso in base alla variazione indipendente delle dimensioni in uno dei suoi widget?

risposta

20

Il layout rispetta gli sizeHint() e minimalSizeHint() dei suoi figli (non il loro size()). Quindi dovresti reimplementare questi due metodi virtuali e restituire la dimensione che desideri forzare. Ogni volta che la tua taglia suggerimento modifiche, si dovrebbe chiamare updateGeometry() sul proprio widget per attivare un aggiornamento del layout in cui il widget viene collocato in

vedere la documentazione:.

  • virtual QSize QWidget::sizeHint() const

    Questa proprietà contiene le dimensioni consigliate per il widget.
    [...]

  • virtual QSize QWidget::minimumSizeHint() const

    Questa proprietà vale la dimensione minima consigliata per il widget.
    [...]
    QLayout non ridimensionerà mai un widget a una dimensione inferiore all'hint di dimensioni minime a meno che sia impostato minimumSize() o che la politica della dimensione sia impostata su QSizePolicy :: Ignore. Se è impostato minimumSize(), l'hint di dimensioni minime verrà ignorato.

Quindi, per forza una dimensione minima del tuo widget, implementare minimumSizeHint() restituendo la dimensione minima; per forzare una dimensione fissa, implementare entrambi restituendo la stessa dimensione.

Consiglio anche la lettura del seguente sezione nella pagina di documentazione "Layout Management":

widget personalizzati nei layout

Quando si effettua la propria classe del widget, si dovrebbe anche comunicare le sue proprietà di layout. Se il widget ha uno dei layout di Qt, questo è già stato curato. Se il widget non ha widget figli, o utilizza il layout manuale, è possibile modificare il comportamento del widget utilizzando qualsiasi o tutti i seguenti meccanismi:

  • reimplementare QWidget :: sizehint() per restituire la dimensione preferita del widget.
  • Reimplementare QWidget :: minimumSizeHint() per restituire la dimensione minima che il widget può avere.
  • Chiama QWidget :: setSizePolicy() per specificare i requisiti di spazio del widget.

Chiama QWidget :: updateGeometry() ogni volta che il suggerimento di dimensione, il suggerimento di dimensione minima o la politica di dimensione cambia. Ciò causerà un ricalcolo del layout.Più chiamate consecutive a QWidget :: updateGeometry() causeranno solo un ricalcolo del layout.


Update (vedi commenti):

È anche possibile forzare una dimensione (o solo altezza/larghezza) chiamando:

QWidget::setFixedSize(QSize); 
QWidget::setFixedHeight(int); 
QWidget::setFixedWidth(int); 

Questi metodi semplicemente impostare la dimensione suggerisce il valore dato e chiama updateGeometry() AFAIK. Ma forse fanno un po 'di più da quando (come si vede nei commenti) questo è stato l'unico modo che ho trovato per risolvere il problema qui.

+0

Grazie. Ho aggiunto quelle funzioni, ma sembravano essere chiamate solo quando i widget sono stati creati per la prima volta. Quando ridimensiono il layout, non vengono richiamati, anche se i widget stanno ovviamente ridimensionando. – George

+0

Hai provato anche a chiamare 'updateGeometry()' in seguito? Che tipo di layout stai usando? Hai ricontrollato eventuali errori nell'aggiunta del widget al layout? Senza usare il grip di ridimensionamento, il tuo 'QTextEdit' agisce come di consueto per le modifiche al layout (ridimensionamento del widget principale)? – leemes

+0

Bene, questo è quello che sto facendo. Non sono un mago di Qt o di niente. http://pastebin.com/mRNLZEAp Ho tagliato tutto ciò che non era rilevante. Se chiamo updateGeometry() ovunque, perdo la possibilità di ridimensionare il textedit. – George

Problemi correlati