2013-01-18 12 views
5

Czy można mieć QSplitter, który ma jeden widżet o stałym rozmiarze, a drugi o zmiennej wielkości?QSplitter z jednym widgetem o stałym rozmiarze i jednym widgetem o zmiennej wielkości?

Ten kod ustawia wszystko w porządku, ale gdy okno jest zmieniany zmiany splitter proporcjonalnie do początkowych rozmiarów widgetów:

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

Dziękuję.

Odpowiedz

12

Spróbuj tego:

QSplitter::setStretchFactor (int index, int stretch)

Wystarczy ustawić współczynnik rozciągania części ma pozostać stałym rozmiarze 0 i ustawić ją na 1 po drugiej widget.

Podczas zmiany rozmiaru całego okna widget z współczynnikiem rozciągnięcia 0 nie zmienia rozmiaru.

0

Próbuję zrobić coś podobnego. Mam jeden stały widget (u góry) i jeden niezmienny widget (u dołu). Chcę, aby użytkownik mógł normalnie korzystać z uchwytu rozdzielacza, ale nie chcę zmieniać rozmiarów okna, aby dodać przestrzeń do stałego widgetu. Używanie metody setSizePolicy w obu widżetach nie działało dla mnie, podobnie jak użycie parametru setStretchFactor w jednym lub obu widgetach.

Skończyłem podklasę QSplitter, dzięki czemu mogłem zaimplementować resizeEvent, który przesunie splittera po zmianie rozmiaru splittera. Ten kod zakłada: Istnieją tylko dwa widżety. Górna [0] może być zmieniana, a dolna [1] nie.

Oto resizeEvent że napisałem:

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