2011-11-29 2 views
7

Я использую QTabWidget, и мне нужен способ обработать изменение текущей вкладки до ее фактического завершения и, возможно, отменить ее, если выполняются определенные условия. Сигнал QTabWidget::currentChanged принимается после того, как текущая вкладка изменилась, но есть ли сигнал QTabWidget::currentChanging или другой способ достижения необходимого мне поведения?Как определить, меняется ли текущая вкладка в QTabWidget?

+4

Я не верю, что есть такой крючок ... вам придется вручную откинуться назад. Но это не похоже на очень хороший пользовательский интерфейс. Почему бы вам не включить состояние включения вкладки, чтобы оно отражало его доступность, вместо того, чтобы пытаться «отклонить» щелчок на вкладке с корректным отображением? http://doc.qt.nokia.com/latest/qtabwidget.html#setTabEnabled – HostileFork

+0

Будет ли возможно подкласс QTabWidget? Я не проводил никаких исследований по этому вопросу; это просто идея. –

+0

У нас была именно эта проблема, и в конечном итоге она решила написать пользовательский TabWidget с нуля, который вызвал сигнал о замене и позволил объектам наложить вето на предлагаемые изменения. Сказав, что я бы выбрал использовать метод, предложенный @HostileFork, если бы это был вариант. – sjwarner

ответ

3

Это, как я решил его

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

На нажатием одной кнопки, я поставил lockTabs к истинным и сохранить текущий индекс вкладки для lockedTab (INT). Независимо от того, какая вкладка вы нажмете, она просто вернет вас на заблокированную вкладку.

Я согласен с первым комментарием, что отключение вкладок является лучшим способом. Это мое решение для отключения вкладок:

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

В моем случае, я соединяю SIGNAL и SLOT так:

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

и tabSelected() функции, проверить текущий индекс 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

В Вашем объявлении сообщить:

QWidget *saveTab 

Создайте подпрограмму tabChanged есть слот для сигнала currentChanged(). Затем:

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 
Смежные вопросы