2013-01-18 18 views
5

E 'possibile avere un QSplitter che ha un widget di dimensione fissa e l'altro con una dimensione variabile?QSplitter con un widget di dimensioni fisse e un widget di dimensioni variabili?

Questo codice imposta le cose a posto, ma quando la finestra viene ridimensionata i cambiamenti splitter proporzionalmente ai widget dimensioni iniziali:

vSplitter = new QSplitter(Qt::Vertical, this); 
vSplitter->addWidget(widget1); 
vSplitter->addWidget(widget2); 
QList<int> heights; 
heights.push_back(550); 
heights.push_back(1000); 
vSplitter->setSizes(heights); 

setCentralWidget(vSplitter); 

Grazie.

risposta

12

Provate questo:

QSplitter::setStretchFactor (int index, int stretch)

Basta impostare l'allungamento della parte che si desidera rimanere dimensione fissa a 0 e impostarlo su 1 sull'altro dei widget.

Quando ridimensiona l'intera finestra, il widget con il fattore di allungamento 0 non verrà ridimensionato.

0

Sto provando a fare qualcosa di simile. Ho un widget fisso (in alto) e un widget non fisso (in basso). Voglio che l'utente sia in grado di usare normalmente lo splitter, ma non voglio che le ridimensionamenti delle finestre aggiungano spazio al widget fisso. L'uso di setSizePolicy su entrambi i widget non ha funzionato per me, e nemmeno con setStretchFactor su uno o su entrambi i widget.

Ho terminato la sottoclasse di QSplitter in modo da poter implementare un resizeEvent che spostava lo splitter dopo il ridimensionamento dello splitter. Questo codice presuppone: Ci sono solo due widget. La parte superiore [0] è ridimensionabile e la parte inferiore [1] non dovrebbe essere.

Ecco il resizeEvent che ho scritto:

MySplitter::resizeEvent(QResizeEvent *event) { 
    /* The first resizeEvent is -1 for height and width, because it was 
     invisible before. */ 
    if (event->oldSize().height() != -1) { 
     int diff; 
     QList<int> previousSizes = sizes(); 
     QSplitter::resizeEvent(event); 
     QList<int> newSizes = sizes(); 
     /* The bottom widget is the fixed one, so find out if that is to 
      grow or shrink. */ 
     diff = newSizes[1] - previousSizes[1]; 
     if (diff > 0) { 
      /* Keep the bottom from growing by giving the size to the top. */ 
      newSizes[0] += diff; 
      newSizes[1] -= diff; 
     } 
     else { 
      /* Steal size from the top to keep it from shrinking. */ 
      newSizes[0] -= diff; 
      newSizes[1] += diff; 
     } 
     setSizes(newSizes); 
    } 
    else 
     QSplitter::resizeEvent(event); 
}