IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

redéfinir la touche "Agrandir" dans un MDI


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut redéfinir la touche "Agrandir" dans un MDI
    Bonjour à tous,

    J'ai développé une application de type MDI. J'ai utilisé des redéfinitions de QMainWindow, QMdiArea et QMdiSubWindow.
    Dans cette application, certaines de mes fenêtres filles ont une largeur fixée.

    J'aimerais pour ces fenêtres là, redéfinir l'action du bouton "Agrandir" situé dans le coin supérieur droit (à côté de la croix), pour qu'au lieu de se mettre "en plein écran", cette fenêtre prenne une taille que j'aurai choisi.

    J'ai essayé de redéfinir les showFullScreen() et showMaximized() de mes mdiSubWindows, mais ça ne marche pas. Est ce une autre méthode qui est appelée ? Y'a t'il une façon particulière de procéder dans une mdiArea ?

    Si quelqu'un s'est interessé à cette fonction, merci de partager votre expérience.

    Bonne rentrée à tous,

    G.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Je ne vois toujours pas, j'ai l'impression que les actions liées au bouton "maximize" n'appellent ni le slot showFullScreen() ni showMaximized();

    Je me suis également penché sur les fonctions de gestion des évènements telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void actionEvent(QActionEvent *ae)
    void resizeEvent(QResizeEvent *re)
    Mais j'ai l'impression que, même si elles sont apparamment appelées lors de l'activation du bouton, le changement de taille n'est pas fait dans celles ci.

    Je pense que le meilleur moyen serait de supprimer l'action par défaut du bouton, et de la remplacer par une action personnalisée, mais je n'ai trouvé pas de moyen de récupérer un pointeur sur ce bouton.

    A suivre

  3. #3
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Salut,

    Mais j'ai l'impression que, même si elles sont apparamment appelées lors de l'activation du bouton, le changement de taille n'est pas fait dans celles ci.
    effectivement, si on regarde la doc de resizeEvent(), on a :

    This event handler can be reimplemented in a subclass to receive widget resize events which are passed in the event parameter. When resizeEvent() is called, the widget already has its new geometry. The old size is accessible through QResizeEvent::oldSize().
    moi je vois une solution (peut-être), mais il faudrait savoir la chose suivante :
    lorsqu'une de tes fenêtres MDI est resizée, par exemple avec le bouton pour maximizer, est-ce qu'elle atteint sa taille maximale, dans le sens où sa valeur maximized est à true ? de même dans son état normal.
    Si tes fenêtres filles ont exactement le même comportement qu'une fenêtre normale, alors peut-etre que tu peux mettre le pseudo code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(isMaximized)
    {
         // L'utilisateur à maxilizé la fenêtre
         resize->(maLargeurMaxi, maHauteurmini);
         update();
    }

    je sais pas si lorsqu'une fenêtre est en fullscreen si elle est considérée comme maximized ou comme full screen !

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    J'ai bien pensé à cette solution, mais c'est pas très propre, et ça fait faire 2 resize au lieu d'un. Sinon, je peux aussi supprimer l'action existante, et définir un MouseEvent sur la zone du bouton, mais c'est là aussi un peu du bricolage.

    Je vais chercher encore un peu pour essayer de trouver une façon "propre" de le faire. Il y'a des moyens de customiser la barre de titre, avec les flags, pour afficher tel ou tel bouton, mais aucun moyen d'avoir un accès plus complet à la composition de cette titlebar.

    Mais merci quand même pour ton aide .

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut, j'ai essayé.
    Les slot ne sont pas virtuel, tu ne peut donc pas reimplementer showMaximized (je vien de le découvrir en faisant du pas à pas )
    J'ai fait un truc pas trop mal en utilisant le showEvent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <QtGui>
    class A : public QMdiSubWindow
    {
    Q_OBJECT
    public :
        A(QMdiArea * mdiarea) :QMdiSubWindow(mdiarea)
        {
        }
     
        void showEvent(QShowEvent * event)
        {
     
            if (isMaximized())
            {
                setMaximumSize(400,400);
            }
            else
            {
                setMaximumSize(10000,10000);          
            }
            QMdiSubWindow::showEvent(event);
     
        }
     
     
    };
    #include "main.moc"
     
    int main(int argc, char* argv[])
    {
        QApplication::setStyle(new QCleanlooksStyle );
        QApplication app(argc, argv); 
     
        QMdiArea w;
     
        QMdiSubWindow * mdiw = new A(&w);
        mdiw->setWidget(new QWidget);
     
    	w.show();
     
       return app.exec();
    }
    Si tu veut faire plus de chose, je pense que tu devrais faire ta bar de titre avec tes fonctionnalité. Un peu comme ce thread :
    http://www.developpez.net/forums/d59...titre-windows/

  6. #6
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Exact, si tu veux modifier ta barre de titre, pour ma part c'est bon, j'ai fait tout ce qu'il faut, j'ai une classe quasi prête à distribuer !
    J'attends toujours que Mongaulois me file un espace personnel (petite pique là ).

    Voilà, en gros en quoi consiste mon machin :







    et voilà !

Discussions similaires

  1. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo