2010-08-18 33 views
2

我有一個Qt主窗口,將彈出一個對話框,其中有一個確定和取消按鈕。這個對話框有一個簡單的微調器,當用戶按下確定或取消按鈕時,要求用戶輸入一個應該返回到主窗口的號碼(取消時,它會返回-1)。從用戶鎖定主窗口時,如何讓Qt對話框獲取信息?

我想過在mainWindow.cpp使用代碼的信號,像這樣:

void mainWindow::slot_openNumberDlg(){ 
    // Create a new dialog 
    numberDlg dlg(this); 

    // Show it and wait for Ok or Cancel 
    if(dlg.exec() == QDialog::Accepted){ 
     return; 
    } 
} 

但我怎麼會在對話框中返回微調的值返回到主窗口,如果它被破壞時,按鈕被按下?

我還想到了一種替代解決方案,其中我將在初始化主窗口的構造的對話框,但它未示出,直到信號在mainWindow.cpp激活一個時隙像這樣:

// Create as pointer in main.h: 
numberDlg *dlg; 

// Initialize pointer and setup listener in constructor (main.cpp): 
mainWindow::mainWindow(){ 
    dlg = new numberDlg(); 
    QObject::connect(dlg, SIGNAL(sig_retVal(int)), ui->widget, SLOT(slot_showNum(int))); 
} 

// Make a function to handle show/close: 
void mainWindow::slot_numberOpenClose(bool trigger){ 
    if(trigger){ 
     dlg->show(); 
    } else { 
    dlg->close(); 
    } 
} 

上面的代碼將能夠使用信號/插槽將對話框微調器中的數字發送到mainWindow,但不會鎖定mainWindow。我不希望用戶繼續使用mainWindow,直到對話框被接受或拒絕。

任何關於如何鎖定主窗口並在對話框關閉時發回數字的主意?

回答

6

你應該做的是在返回所需的值對話框類創建一個函數,並使用它,像這樣從你的主窗口:

void mainWindow::slot_openNumberDlg(){ 
    // Create a new dialog 
    numberDlg dlg(this); 

    // Show it and wait for Ok or Cancel 
    if(dlg.exec() == QDialog::Accepted){ 
     m_theValue = dlg.myValue(); // <-- 
     return; 
    } 
} // dlg goes out of scope 

DLG不會被破壞,直到它熄滅我放置評論的範圍,所以你的方法將正常工作。

1

use dlg.setWindowModality(Qt :: WindowModal);

void mainWindow::slot_openNumberDlg(){ 

    numberDlg dlg(this); 
    dlg.setWindowModality(Qt::WindowModal);//blocks input to its parent window 

    if(dlg.exec() == QDialog::Accepted) 
    { 
     dlg.setResult(true);//mask 
     return; 
    } 
    else if(dlg.exec() == QDialog::Rejected) 
    { 
     dlg.setResult(false);//mask 
     return; 
    } 
} 



    if(dlg.getResult() == true)//value usable only when accepted 
    { 
     m_theValue = dlg.myValue(); 
    } 

如果你想更準確的結果,忽略了QWidget的的closeEvent()方法來處理你的對話框的退出按鈕。 (或者你可以設置默認值爲假)

void numberDlg::closeEvent(QCloseEvent *event) 
{ 
    setResult(false); 
    close(); 
} 
相關問題