2010-08-18 2 views
2

J'ai une fenêtre principale Qt qui fera apparaître une boîte de dialogue qui a un bouton OK et Annuler. Cette boîte de dialogue a un simple bouton qui demande à un utilisateur un nombre qui devrait être retourné à la fenêtre principale quand OK ou Annuler est pressé (pour annuler, il renverra juste -1).Comment puis-je faire Qt dialogue obtenir des informations tout en verrouillant la fenêtre principale de l'utilisateur?

Je pensais à l'aide du code dans un signal mainwindow.cpp comme ceci:

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; 
    } 
} 

Mais comment pourrais-je retourner la valeur de la fileuse dans la boîte de dialogue de retour à la fenêtre principale si elle est détruite lorsque le bouton est pressé?

J'ai aussi pensé à une solution alternative où j'initialiser la boîte de dialogue dans le constructeur de mainWindow, mais il n'a pas été représenté jusqu'à ce qu'un signal activé une fente dans mainwindow.cpp comme ceci:

// 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(); 
    } 
} 

Le code ci-dessus serait en mesure d'envoyer le numéro de spinner de la boîte de dialogue à mainWindow en utilisant un signal/slot, mais il ne sera pas verrouiller MainWindow. Je ne veux pas que l'utilisateur continue à utiliser MainWindow tant que la boîte de dialogue n'a pas été acceptée ou rejetée.

Des idées sur la façon dont je peux verrouiller la fenêtre principale et renvoyer un numéro à la boîte de dialogue principale fermer?

Répondre

6

Ce que vous devez faire est de créer une fonction dans votre classe de dialogue qui retourne la valeur que vous voulez, et l'utiliser comme si de votre fenêtre principale:

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 ne sera pas détruit jusqu'à ce qu'il sort de portée où j'ai placé le commentaire, ainsi votre méthode fonctionnera bien.

1

utilisez 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(); 
    } 

Si vous voulez des résultats plus précis, remplacer la méthode closeEvent() de QWidget pour gérer le bouton de sortie de votre boîte de dialogue. (ou vous pouvez définir la valeur par défaut comme false)

void numberDlg::closeEvent(QCloseEvent *event) 
{ 
    setResult(false); 
    close(); 
} 
Questions connexes