2013-01-18 35 views
5

Ist es möglich, eine QSplitter zu haben, die ein Widget mit einer festen Größe und das andere mit einer variablen Größe hat?QSplitter mit einem Widget fester Größe und einem Widget variabler Größe?

Dieser Code setzt die Dinge richtig, aber wenn das Fenster, um die Splitter ändert sich proportional zu den anfänglichen Widgets Größen der Größe geändert wird:

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

Danke.

Antwort

12

Versuchen Sie diese:

QSplitter::setStretchFactor (int index, int stretch)

einfach den Dehnungsfaktor des Teils eingestellt Sie feste Größe auf 0 bleiben wollen und es auf 1 auf dem anderen Widget gesetzt.

Wenn Sie die Größe des gesamten Fensters ändern, ändert sich das Widget mit dem Streckfaktor 0 nicht.

0

Ich versuche etwas ähnliches zu tun. Ich habe ein festes Widget (oben) und ein nicht fixiertes Widget (unten). Ich möchte, dass der Benutzer das Splitter-Handle normal verwenden kann, aber ich möchte nicht, dass die Fenstergröße dem festgelegten Widget mehr Platz bietet. Die Verwendung von setSizePolicy für beide Widgets funktionierte nicht für mich und auch nicht für setStretchFactor auf einem oder beiden Widgets.

Ich habe QSplitter als Unterklasse erstellt, so dass ich ein resizeEvent implementieren konnte, das den Splitter verschieben würde, nachdem der Splitter skaliert wurde. Dieser Code setzt voraus: Es gibt nur zwei Widgets. Die obere [0] ist veränderbar, und die untere [1] sollte nicht geändert werden. Hier

ist das resizeEvent, die ich schrieb:

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); 
} 
Verwandte Themen