2011-11-29 9 views
7

Sto utilizzando un QTabWidget e ho bisogno di un modo per gestire il cambiamento della scheda corrente prima che accada realmente, e possibilmente cancellarlo se sono soddisfatte determinate condizioni. Il segnale QTabWidget::currentChanged viene ricevuto dopo che la scheda corrente è cambiata, ma esiste un segnale QTabWidget::currentChanging o un altro modo per ottenere il comportamento di cui ho bisogno?Come identificare quando la scheda corrente sta cambiando in un QTabWidget?

+4

Non credo che ci sia un tale aggancio ... dovresti tornare indietro manualmente. Ma questa non sembra una buona scelta dell'interfaccia utente. Perché non vorresti che lo stato di abilitazione della scheda riflettesse la sua disponibilità invece di provare a "rifiutare" un clic su una scheda dall'aspetto valido? http://doc.qt.nokia.com/latest/qtabwidget.html#setTabEnabled – HostileFork

+0

Sarebbe possibile creare sottoclasse QTabWidget? Non ho fatto alcuna ricerca in merito; è solo un'idea. –

+0

Abbiamo avuto esattamente questo problema e alla fine abbiamo scelto di scrivere una TabWidget personalizzata da zero che ha prodotto un segnale che cambiava e ha permesso agli oggetti di porre il veto alle modifiche proposte. Detto questo, avrei scelto di utilizzare il metodo proposto da @HostileFork se fosse stata un'opzione. – sjwarner

risposta

3

Ecco come ho risolto

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

Su clic di un pulsante, ho impostato lockTabs alla vera e salvare l'indice scheda corrente a lockedTab (int). Indipendentemente dalla scheda su cui fai clic, ti rimanderò alla scheda bloccata.

Sono d'accordo con il primo commento che la disattivazione delle schede è il modo migliore. Questa è la mia soluzione per schede invalidanti:

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

Nel mio caso, mi collego SEGNALE e SLOT come questo:

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

e in tabSelected() funzione, controllo corrente Indice Tab:

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

Nella propria intestazione, dichiarare:

QWidget *saveTab 

Creare una routine tabChanged avere lo slot per il segnale currentChanged(). Quindi:

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 
Problemi correlati