2012-09-08 2 views
2

J'ai une application où je veux poser une question à l'utilisateur dans un QMessageBox puis répondre en conséquence. Le problème est que sur un Mac je veux que la boîte de dialogue apparaisse comme une feuille, mais en utilisant la méthode open() retourne immédiatement.Qt :: Sheet et QMessageBox :: show() sur Mac

QMessageBox* msgBox = new QMessageBox(
    QMessageBox::Question, 
    "Delete Record?", 
    "Are you sure you want to delete this record?" 
    QMessageBox::Yes | QMessageBox::No, 
    this, 
    Qt::Sheet); 

int ret = msgBox->exec(); // does not show up as a sheet on Mac 
msgBox->open(); // shows up as a sheet but returns immediately 

Y at-il de toute façon je peux obtenir ce qui touche l'utilisateur a appuyé sur une feuille sans avoir à mettre en œuvre ma propre QDialog? Y at-il un signal de msgBox je me connecte?

Répondre

0

C'est échantillon de PyQt de ma demande, mais vous aurez l'idée:

reply = QtGui.QMessageBox.question(self, 'Delete', 
      "Are you sure?", QtGui.QMessageBox.Yes | 
       QtGui.QMessageBox.No, QtGui.QMessageBox.No) 
    if reply == QtGui.QMessageBox.Yes: 
     #some action if YES clicked 
+1

Merci pour la réponse mais cela ne répond pas à ma question. En utilisant la méthode statique question() montre un dialogue modal sur Mac (comme sur Windows) et je veux montrer une feuille. – Addy

4

Le document recommends à l'aide setWindowModality() à la place. Le code suivant fonctionne pour moi:

auto m = new QMessageBox(&window); 
m->setText("some text here"); 
m->setWindowModality(Qt::WindowModal); 
m->exec(); 
+0

yup, qui a fait l'affaire pour moi, merci pour le partage – koda

+0

Mais exec() le rendrait "application modale", c'est-à-dire, aucune autre fenêtre de l'application pourrait recevoir des événements. Si vous voulez vraiment recevoir des événements dans d'autres fenêtres, puisqu'un QMessageBox est un QDialog, vous pouvez vous connecter aux signaux de QDialog, puis appeler open(). – bootchk