2011-11-29 75 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爲true,並保存當前選項卡索引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

就我而言,我連接信號和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 

創建例程tabChangedcurrentChanged()信號的插槽。然後:

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 
相關問題