2011-11-29 13 views
7

Estoy usando un QTabWidget y necesito una forma de manejar el cambio de la pestaña actual antes de que realmente suceda, y posiblemente cancelarla si se cumplen ciertas condiciones. La señal QTabWidget::currentChanged se recibe después de que la pestaña actual haya cambiado, pero ¿hay una señal QTabWidget::currentChanging u otra forma de lograr el comportamiento que necesito?¿Cómo identificar cuándo está cambiando la pestaña actual en un QTabWidget?

+4

No creo que exista tal gancho ... tendrías que voltear manualmente. Pero esto no parece una muy buena opción de interfaz de usuario. ¿Por qué no haría que el estado de habilitación de la pestaña reflejara su disponibilidad en lugar de intentar "rechazar" un clic en una pestaña de aspecto válido? http://doc.qt.nokia.com/latest/qtabwidget.html#setTabEnabled – HostileFork

+0

¿Sería posible subclasificar QTabWidget? No he hecho ninguna investigación sobre el asunto; es solo una idea –

+0

Tuvimos exactamente este problema y finalmente decidimos escribir un widget TabWidget personalizado desde el principio, lo que produjo una señal de cambio y permitió a los objetos vetar los cambios propuestos. Habiendo dicho eso, hubiera elegido usar el método propuesto por @HostileFork si hubiera sido una opción. – sjwarner

Respuesta

3

Esto es cómo lo resolví

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

El clic de un botón, me puse a lockTabs verdadera y guardar el índice ficha actual a lockedTab (int). No importa en qué pestaña haga clic, simplemente lo devolverá a la pestaña bloqueada.

Estoy de acuerdo con el primer comentario de que desactivar las pestañas es la mejor manera. Esta es mi solución para pestañas discapacitantes:

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

En mi caso, conectar la señal y la ranura de la siguiente manera:

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

y en tabSelected() función, puedo comprobar Índice de fichas actual:

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

En su encabezado, declare:

QWidget *saveTab 

Cree una rutina tabChanged tenga la ranura para la señal currentChanged(). Entonces:

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 
Cuestiones relacionadas