2010-04-16 4 views
3

J'utilise la fonction sympa de QMessageBox pour afficher un texte détaillé à l'utilisateur. Cependant, la fenêtre après expansion est encore assez petite, et on essaie immédiatement de redimensionner la fenêtre afin que plus de détails soient visibles. Même après avoir défini ce que je pense être les paramètres appropriés, il ne permettra pas le redimensionnement.Comment autoriser le redimensionnement de QMessageBox dans PyQt4

Voici l'extrait pertinent du Code PyQt4:

mb = QMessageBox() 
mb.setText("Results written to '%s'" % filename) 
mb.setDetailedText(str(myData)) 
mb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 
mb.setSizeGripEnabled(True) 

Suis-je manque une étape et/ou est-ce possible?

+0

Voulez-vous dire que lorsque le QMessageBox est affiché, il est pas assez grand pour afficher votre contenu (par exemple, les choses se coupent)? –

+0

Désolé, je n'étais pas clair. Je voulais dire que le texte détaillé est limité à une * petite * zone de texte (avec des barres de défilement). Visible, mais pas agréable du point de vue de l'utilisateur. Si le 'QMessageBox' pourrait juste être redimensionné manuellement comme l'utilisateur le souhaite, cela améliorerait considérablement l'expérience globale. Même avec les appels 'setSizePolicy()' et 'setSizeGripEnabled()', il n'est toujours pas possible de redimensionner la fenêtre. – metasim

+1

Avez-vous essayé la politique de taille MinimumExpanding? Au-delà de cela, vérifiez pour voir à quel paramètre maximumSize est défini. Vous devrez peut-être sous-classer QMessageBox et ré-implémenter sizeHint() pour retourner ce que vous voulez. J'ai toujours trouvé qu'il y avait un peu de vaudou à implémenter des widgets de haut niveau pour se redimensionner correctement en fonction de leur contenu. L'autre chose que vous pouvez essayer est de définir la contrainte de taille de la disposition: 'mb.layout() -> setSizeConstraint (QLayout :: SetMaximumSize)' (Ah, c'est C++ - pas familier avec la syntaxe python) –

Répondre

4

Th C'est la solution que j'utiliserais. Cela ne rend pas la boîte de dialogue redimensionnable, mais elle fait en sorte que le dialogue change lui-même à une taille raisonnable lorsque la boîte de détails est visible. J'ai volé sans honte quelques idées de la réponse de serge_gubenko. Même si vous préférez implémenter son redimensionnement, j'offre humblement d'autres améliorations ci-dessous.

# Safe since everything in the namespace begins with 'Q' 
from PyQt4.QtGui import * 

class MyMessageBox(QMessageBox): 

    # This is a much better way to extend __init__ 
    def __init__(self, *args, **kwargs):    
     super(MyMessageBox, self).__init__(*args, **kwargs) 
     # Anything else you want goes below 

    # We only need to extend resizeEvent, not every event. 
    def resizeEvent(self, event): 

     result = super(MyMessageBox, self).resizeEvent(event) 

     details_box = self.findChild(QTextEdit) 
     # 'is not' is better style than '!=' for None 
     if details_box is not None: 
      details_box.setFixedSize(details_box.sizeHint()) 

     return result 
+0

Cela ne fonctionne pas du tout sous linux.Mais même si cela fonctionnait, cela ne répondrait pas à la question, car cela ne redimensionne pas le message. (PS: la substitution de '__init__' est totalement redondante dans cet exemple). – ekhumoro

4

si vous cherchez à faire une boîte de message redimensionnable, pls, vérifier si le code ci-dessous fonctionnerait pour vous:

class MyMessageBox(QtGui.QMessageBox): 
    def __init__(self): 
     QtGui.QMessageBox.__init__(self) 
     self.setSizeGripEnabled(True) 

    def event(self, e): 
     result = QtGui.QMessageBox.event(self, e) 

     self.setMinimumHeight(0) 
     self.setMaximumHeight(16777215) 
     self.setMinimumWidth(0) 
     self.setMaximumWidth(16777215) 
     self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 

     textEdit = self.findChild(QtGui.QTextEdit) 
     if textEdit != None : 
      textEdit.setMinimumHeight(0) 
      textEdit.setMaximumHeight(16777215) 
      textEdit.setMinimumWidth(0) 
      textEdit.setMaximumWidth(16777215) 
      textEdit.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 

     return result 

est ici comment messagebox est appelé:

mb = MyMessageBox() 
mb.setText("Results written to '%s'" % 'some_file_name') 
mb.setDetailedText('some text') 
mb.exec_() 
solution

est prise de here

espérons que cette aide, ce qui

+0

Ceci est certainement sur la bonne voie (Dommage que cela doive être fait dans le gestionnaire d'événements). La boîte de dialogue se redimensionne maintenant, mais tout le redimensionnement va à l'étiquette en haut, et non la zone de texte. J'ai passé environ une demi-heure à jouer avec la définition de 'sizePolicy' des autres composants et le' rowStretch' de la mise en page sous-jacente, mais je n'ai rien trouvé de plus. C'est certainement mieux que ce que j'avais. Je posterai un suivi si je trouve comment donner tout l'espace vertical supplémentaire à la zone de texte. – metasim

+0

@serge_gubenko lorsque j'appuie sur le bouton de maximisation de la boîte de dialogue (ceci est affiché lorsque le bouton 'Afficher les détails' est enfoncé), la boîte de dialogue maximise un instant et revient immédiatement à la normale (et se déplace dans le coin supérieur gauche) écran). Une idée de comment le bouton peut-il être réglé? –

0

Cela fonctionne, mais seulement testé sur Linux sous Gnome 2. Il est redimensionnée horizontalement que à moins que le texte « afficher les détails » est activée, auquel cas il redimensionne dans les deux sens. Le bouton « afficher les détails » remet encore à la taille initiale, c'est soit une fonction ou un bug en fonction de votre pov:

bool MyMessageBox::event(QEvent* e) 
{ 
    bool result = QMessageBox::event(e); 
    // force resizing back on, QMessageBox keeps turning it off: 
    if (maximumWidth() != QWIDGETSIZE_MAX) { 
     QTextEdit *textEdit = findChild<QTextEdit*>(); 
     if (textEdit && textEdit->isVisible()) { 
      textEdit->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
      textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
      setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
      setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
     } else { 
      setMaximumWidth(QWIDGETSIZE_MAX); 
      setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); 
     } 
    } 
    return result; 
}