2011-11-29 18 views
7

Używam QTabWidget i potrzebuję sposobu na obsłużenie zmiany aktualnej zakładki, zanim to się stanie i ewentualnie anulowanie, jeśli zostaną spełnione określone warunki. Sygnał QTabWidget::currentChanged jest odbierany po zmianie bieżącej zakładki, ale czy istnieje sygnał lub inny sposób uzyskania pożądanego zachowania?Jak rozpoznać, kiedy bieżąca karta zmienia się w QTabWidget?

+4

Nie wierzę, że istnieje taki hak ... trzeba ręcznie odwrócić. Ale to nie brzmi jak bardzo dobry wybór interfejsu użytkownika. Dlaczego nie sprawisz, że stan włączenia karty będzie odzwierciedlał jej dostępność, zamiast próbować "odrzucić" kliknięcie na poprawnej karcie? http://doc.qt.nokia.com/latest/qtabwidget.html#setTabEnabled – HostileFork

+0

Czy istnieje możliwość podklasy QTabWidget? Nie zrobiłem żadnych badań w tej sprawie; to tylko pomysł. –

+0

Mieliśmy dokładnie ten problem i ostatecznie zdecydowaliśmy się napisać od podstaw niestandardowy obiekt TabWidget, który wyprodukował sygnał do zmiany i pozwolił obiektom zawetować proponowane zmiany. Powiedziałem, że wybrałbym metodę proponowaną przez @HostileFork, gdyby była to opcja. – sjwarner

Odpowiedz

3

To jak ja rozwiązałem

void MainWindow::on_tabWidget_currentChanged(int index) 
{ 
    if (lockTabs) ui->tabWidget->setCurrentIndex(lockedTab); 
} 

Na kliknięcie przycisku, ustawić lockTabs na true i zapisać bieżący indeks TAB, aby lockedTab (int). Bez względu na to, którą zakładkę klikniesz, po prostu wrócisz do zablokowanej karty.

Zgadzam się z pierwszym komentarzem, że wyłączenie kart jest lepszym sposobem. To jest moje rozwiązanie dla kart inwalidztwo:

void MainWindow::lockTabs(int except){ 
    for (int i=0; i<ui->tabWidget->count(); i++) { 
     if (i!=except) ui->tabWidget->setTabEnabled(i, false); 
    } 
} 

void MainWindow::unlockTabs() { 
    for (int i=0; i<ui->tabWidget->count(); i++) { 
     ui->tabWidget->setTabEnabled(i, true); 
    } 
} 
5

W moim przypadku podłączenia sygnału i SLOT tak:

//check if user clicked at a tab 
connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabSelected())); 

aw tabSelected() funkcji sprawdzić bieżący wskaźnik zakładka:

void MainWindow::tabSelected(){ 
    if(ui->tabWidget->currentIndex()==0){ 

     // Do something here when user clicked at tab1 

    } 
    if(ui->tabWidget->currentIndex()==3){ 

     // Do something here when user clicked at tab4 

    } 
} 
1

W nagłówku zadeklaruj:

QWidget *saveTab 

Utwórz procedurę tabChanged ma gniazdo na sygnał currentChanged(). Następnie:

void pkgName::tabChanged 
//"ask your question" 
if "bad reply" 
    // This is where you'll "set back to your old tab" 
    ui->tabWidget->setCurrentWidget(savedWidget) 
end if 
savedWidget = ui->tabWidget-> getCurrentWidget() 
// Process