2011-11-29 22 views
7

Tôi đang sử dụng QTabWidget và tôi cần một cách để xử lý thay đổi của tab hiện tại trước khi nó thực sự xảy ra và có thể hủy nó nếu đáp ứng các điều kiện nhất định. Bạn nhận được tín hiệu QTabWidget::currentChanged sau khi tab hiện tại đã thay đổi, nhưng có tín hiệu QTabWidget::currentChanging hoặc cách khác để đạt được hành vi tôi cần không?Cách xác định khi nào tab hiện tại đang thay đổi trong QTabWidget?

+4

Tôi không tin có móc như vậy ... bạn sẽ phải tự lật lại. Nhưng điều này không có vẻ giống như một lựa chọn giao diện người dùng rất tốt. Tại sao bạn không làm cho trạng thái kích hoạt của tab phản ánh tính khả dụng của nó thay vì cố gắng "từ chối" một nhấp chuột trên tab tìm kiếm hợp lệ? http://doc.qt.nokia.com/latest/qtabwidget.html#setTabEnabled – HostileFork

+0

Có thể phân lớp QTabWidget được không? Tôi chưa thực hiện bất kỳ nghiên cứu nào về vấn đề này; nó chỉ là một ý tưởng. –

+0

Chúng tôi đã có chính xác vấn đề này và cuối cùng đã chọn để viết một TabWidget tùy chỉnh từ đầu mà tạo ra một tín hiệu về thay đổi và cho phép các đối tượng để phủ quyết thay đổi đề xuất. Có nói rằng tôi đã chọn để sử dụng phương pháp được đề xuất bởi @HostileFork nếu đó là một lựa chọn. – sjwarner

Trả lời

3

Đây là cách tôi giải quyết nó

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

On bấm vào một nút, tôi đặt lockTabs true và lưu các chỉ số tab hiện tại để lockedTab (int). Không có vấn đề gì tab bạn nhấp vào nó sẽ chỉ ném bạn trở lại tab bị khóa.

Tôi đồng ý với nhận xét đầu tiên rằng tắt tab là cách tho tốt hơn. Đây là giải pháp của tôi cho các tab vô hiệu hóa:

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

Trong trường hợp của tôi, tôi kết nối SIGNAL và SLOT như thế này:

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

và trong tabSelected() chức năng, tôi kiểm tra Tab Index hiện tại:

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

Trong tiêu đề của bạn, khai báo:

QWidget *saveTab 

Tạo một thường lệ tabChanged có khe cho tín hiệu currentChanged(). Sau đó:

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 
Các vấn đề liên quan