2009-10-20 12 views
5

Chcę móc zatrzymać użytkownika przed przeniesieniem modułu QSplitter w czasie wykonywania. Dzwonienie pod numer setEnabled(false) powoduje to, ale powoduje także wyłączenie wszystkich widżetów podrzędnych - co nie jest tym, czego chcę. Czy istnieje sposób, aby to osiągnąć? Czy muszę wyłączyć rozdzielacz, a następnie ręcznie włączyć ponownie wszystkie widżety podrzędne? Wydaje się to dość kłopotliwe, jeśli chodzi o coś, co musi być dość powszechną praktyką.Wyłączenie rozgałęźnika Qt

Czy ktoś może sugerować coś?

Odpowiedz

1

Właściwie nigdy nie widziałem nikogo, kto kiedykolwiek wyłączyłby splitter: są tam, więc użytkownik może układać interfejs tak, jak potrzebuje, więc dlaczego ktoś miałby chcieć go wyłączyć? Albo potrzebujesz rozgałęźnika, albo możesz użyć jednego z normalnych układów (którego użytkownik nie może zmienić rozmiaru).

Jeśli nadal chcesz spróbować, myślę, że powinieneś spojrzeć na closestLegalPosition() lub getRange(). Jeśli po prostu zwrócisz szerokość widżetu, zmiana rozmiaru powinna przestać działać.

+1

myślę, że będzie to najprostszy sposób - w przypadku użycie jest to: Mam UI, które mogą być wprowadzone do określonego trybu, w którym jeden z dzieckiem rozgałęźnika za widżety znikają. W takim przypadku nie chcę, aby użytkownik mógł przesuwać splittera, ponieważ istnieje tylko widget z jednej strony - czy to ma sens? – Thomi

+0

Nieparzysty. Domyślam się, że splitter nie zaoferuje elementu drag, jeśli ma tylko jedno dziecko. Czy możesz sprawdzić, czy naprawdę jest tylko jedno dziecko? –

+0

Nie można w rzeczywistości usunąć widżetu ze splittera - publiczny interfejs API QSplitter nie zapewnia metody, aby to zrobić. Najlepsze, co możesz osiągnąć, to ukryć dzieci. Jakieś pomysły? – Thomi

0

Musisz zrobić dwie rzeczy. Ustaw widgety (które nie powinny mieć rozmiaru) wewnątrz rozdzielacza do FixedSize i zmień kursor odpowiadających uchwytów splitter na Qt::ArrowCursor. Uchwyty zacząć od zera (po lewej i nie używane), więc pierwszy uchwyt pomiędzy dwoma widżetów jest indeksem 1.

Oto próbka (umieścić kod w main.cpp):

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget window; 
    window.resize(800, 300); 
    window.setWindowTitle("Splitter Test"); 
    window.show(); 

    QSplitter *splitter = new QSplitter(&window); 
    QListView *listview = new QListView; 
    QTreeView *treeview = new QTreeView; 
    QTextEdit *textedit = new QTextEdit; 

    splitter->addWidget(listview); 
    splitter->addWidget(treeview); 
    splitter->addWidget(textedit); 
    splitter->setChildrenCollapsible(false); 

    splitter->show(); 
    listview->show(); 
    treeview->show(); 
    textedit->show(); 

    //make the lisview 'fix' 
    listview->setFixedSize(listview->width(), listview->height()); 
    //change the cursor over the splitter handle between listview and 
    //treeview to ArrowCursor 
    splitter->handle(1)->setCursor(Qt::ArrowCursor);; 

    return app.exec(); 
} 

Teraz pierwszy uchwyt splittera to disabled, a drugi działa.

10

Wykonaj:

for (int i = 0; i < splitter->count(); i++) 
{ 
    QSplitterHandle *hndl = splitter->handle(i); 
    hndl->setEnabled(false); 
}