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 :

Empêcher l'ancrage d'un QDockWidget


Sujet :

Qt

  1. #1
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut Empêcher l'ancrage d'un QDockWidget
    Bonjour à tous,

    Comme indiqué dans le titre, je travaille sur une fenêtre dockable, et pour vous situer dans mon interface, cette fenêtre dock est flotante dès le début de l'interface, et on ne peut pas la fermer (j'utilise un systeme de fenetres à onglets, et la fenetre dock apparait uniquement dans un seul onglet). Enfin, pour mon application, c'est niquel.

    Le seul souci, c'est que quand on clique sur la fenêtre dockable, celle-ci se retrouve ancrée (je sais pas si ça se dit) dans l'interface graphique, et elle peut s'ancrer vraiment n'importe où, ce qui pose problème.

    Je voudrais donc savoir si il était possible, soit d'empêcher que le double-clic ne l'ancre dans la fenêtre, soit lui définir où se mettre lors d'un double-clic
    Je sollicite donc votre aide pour répondre à ce problème

    Au passage, voici le bout de code qui définit toutes les propriétés que j'applique déjà à cette fenêtre dockable, au cas où :p

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dock = new QDockWidget(tr("Echelles manuelles"), this);
    	dock->setWidget(new EchellesWidget(this)); //Echelles widget est une classe à part héritée de QWidget
    	dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
    	dock->setVisible(true);
    	dock->setFloating(true);
    	dock->setWindowOpacity(0.85);
    	dock->setGeometry(150,150,200,205);

  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
    Salut,

    Il te suffit de redéfinir l'action à faire quand l'utilisateur double clique sur ce widget.

    Pour cela, il faut redéfinir la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void mouseDoubleClickEvent ( QMouseEvent * event )
    Dedans, tu fais ce que tu veux (move, resize, etc.), et tu fais event->ignore() à la fin pour que l'action par défaut ne soit pas réalisée.

    Bonne chance,

    G.

  3. #3
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Salut, merci pour ta réponse.

    J'ai essayé de définir un slot personnalisé avec la méthode que tu me donnes.

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void MainWindow::on_dock_mouseDoubleClickEvent(QMouseEvent *event) {
    	event->ignore();
    }

    Et le souci c'est que ça ne fonctionne pas. La méthode mouseDoubleClickEvent(QMouseEvent *event) n'est peut être pas un signal ?

  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
    Non, en effet.

    Tu es obligé de faire ta propre classe qui étend QDockWidget, dans laquelle tu redéfinie la méthode en question. Il n'y a pas d'autres solutions, mais ça prend 30 sec.

    G.

    PS : de plus, tu ne peux pas gérer ça sur ta MainWindow, parce que ce n'est pas elle qui recoit l'event en premier. C'est bien ta DockWidget qui le gère.

  5. #5
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    D'accord je te remercie, j'essaye ça

  6. #6
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Bon après avoir essayé, mon code donne ceci :

    le dock.h :
    Code c++ : 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
    #ifndef DOCK_H
    #define DOCK_H
     
    #include <QDockWidget>
    #include <QMouseEvent>
     
    class Dock : public QDockWidget
    {
    	Q_OBJECT
     
    public:
    	Dock(const QString & title, QWidget * parent = 0, Qt::WindowFlags flags = 0) : QDockWidget(title, parent, flags){;}
    	virtual void mouseDoubleClickEvent(QMouseEvent *event);
    };
     
    #endif //DOCK_H

    Et mon cpp donne :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "dock.h"
     
    void Dock::mouseDoubleClickEvent(QMouseEvent *event) {
    	event->ignore();
    }

    Et la déclaration du dock de la même manière que tout à l'heure... Mais ça ne fonctionne pas... Je ne vois pas du tout pourquoi, alors peut être que ce sera un truc tout bête mais bon...

  7. #7
    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
    Dans ton .h, il faut que la définition ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    protected:
     
    	 void mouseDoubleClickEvent (QMouseEvent * event);
    La fonction est protected dans QDockWidget, donc si tu veux la redéfinir, il faut garder la même portée. De plus, cette fois, tu définis vraiment la fonction, pas besoin du virtual.

    G.

  8. #8
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Ah oui en effet, j'avais dégligé ce détail... Néanmoins, l'ancrage se fait toujours, je ne comprends pas

  9. #9
    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
    Es tu sur que c est le double clic sur le widget qui entraine le dock ? Parce que si tu as bien reimplémenté la fonction, ca ne devrait plus faire ce genre de choses.

    G.

  10. #10
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Je ne vois pas ce qui pourrait déclencher l'ancrage autrement... L'event se produit quand je double-clique sur la dock, donc je suppose que c'est ça...
    Maintenant, ça ne fonctionne pas, c'est pourquoi j'ai un doute là dessus

  11. #11
    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
    Salut,

    Alors j'ai testé (parce que ca me turlupinait).

    Donc en fait c'est quand on double click sur le bandeau que la fenetre se dock. Hors, le mouseDoubleClickEvent() n'agit que sur "l'intérieur" de la fenêtre.

    La redefinition de la fonction est donc inutile. Il faut donc peut etre jouer avec les window flags. Mais puis je savoir pourquoi il te faut un dock widget si tu ne veux pas docker ?

    G.

  12. #12
    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
    Ok, j'ai trouvé une nouvelle piste, mais sans doute un peu plus lourde. Va lire ici.

    Il s'agit en fait de définir ta propre bar de titre, afin de choisir entre autres les actions des différents évènements de celle ci. J'ai pas insisté. En tout cas, il faut redéfinir les deux méthodes sizeHint et minimumSizeHint de ton widget custom.

    Bon courage,

    G.

  13. #13
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Je te remercie pour ton aide Je vais de ce pas lire le lien que tu m'as filé

    Pour répondre à ta question, j'ai besoin d'une fenêtre dock dans mon interface graphique pour diverses raisons :

    J'utilise un tabwidget, et sur l'un des onglets il y avait une groupBox dans lesquelles diverses options sont disponibles, et j'ai trouvé plus agréable de faire de cette groupBox une fenetre flottante. De plus, je rends cette fenêtre dock visible uniquement sur cet onglet, et c'est exactement ce dont mon interface a besoin
    Donc voila, j'espere avoir répondu a ta question

  14. #14
    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
    Oui, mais pourquoi une DockWidget ?

    Tu peux faire une fenêtre flottante sans pour autant faire un DockWidget. Le principal avantage de la dockwidget est, selon moi, le mécanisme de dock ^^.

    Enfin bon, essaie quand même de faire le truc, ca m'intéresse .

    G.

  15. #15
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Désolé de ne pas avoir donné de suite à ce post J'ai tout simplement abandonné mon idée pour le dock, et j'ai utilisé un QDialog, c'était trop compliqué pour au final presque rien...

    Je te remercie pour l'aide que tu m'as apporté, j'ai quand même appris quelques trucs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AppMessage] Comment empêcher un click de la souris ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/10/2003, 15h28
  2. Comment empêcher la mise à jour d'un contrôle à l'écran ?
    Par JojoLaFripouille dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2003, 13h52
  3. Comment empêcher l'ouverture d'un TPopupMenu !?
    Par Lung dans le forum Composants VCL
    Réponses: 9
    Dernier message: 20/08/2003, 12h47
  4. Empécher la sélection du texte des pages dans un WebBrowser
    Par DevelOpeR13 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 05/06/2003, 19h36
  5. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 15h14

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