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 :

Diverses questions préoccupantes


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 72
    Par défaut Diverses questions préoccupantes
    Bonsoir Bonsoir
    J'ai cette fois trois problèmes qui me préoccupent depuis quelques jours maintenant, et je serai très ravi d'avoir vos aides.

    1)
    Actuellement, je réalise une application sous Linux-SUSE ( OS qui ne m'est vraiment pas famillié) avec Qt 4.3 . La portion de code suivante me genère toujours un "Warning" du type
    ---- parent : never used. ----
    ---- tEvent : never used. ----
    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
     
    class CDlg, public QDialog
    {
    public:
      CDlg(QWidget *parent = 0);
      virtual void resizeEvent(QResizeEvent *);
    };
     
    CDlg::CDlg(QWidget *parent):
    {
      // positionnement de quelques elements sur la fénêtre
      // sans au préalable utiliser le parametre parent"
    }
     
    void CDlg::resizeEvent(QResizeEvent *tEvent)
    {
      // Aucune activité
    }
    Sauriez-vous à quoi cela peut être dû ? Comment pourais-je éviter ces warning ?

    2)
    Dans mon application, j'affiche une boite de dialogue de type QDialog. Ne désirant pas avoir de bordures (pas de boutons fermer, reduire ou agrandir), j'appele la foncion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "setWindowFlags(Qt::FramelessWindowHint);"
    Du coup, ma boite de dialogue n'est plus centrée dans la fénêtre principale. Elle apparait maintenant à l'angle suppérieure gauche de mon écran; ce qui n'est pas le cas sous l'OS Windows.
    Comment pourais-je recentrer ma boite de dialogue sur la fénêtre principale ?

    3)
    Toujours dans mon application, je désire faire une impression.
    Sur un widget, je réalise tout un tas de dessin . Vu que les dimensions de mon widget depassent de loin celles d'un format A4, l'integralité des dessins n'est pas imprimée.
    Comment peut-on se rassurer que les dimensions (en pixels) d'un Widget équivalent à celles (en millimetres) d'un papier A4. ?
    Mieux encore, quelqu'un aurait-il une autre astuce ?

    Désolé d'avoir été aussi long.
    C'est quant même trois questions en un topic

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    1) Il faut juste commenter le nom des paramètres, comme ceci:
    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
     
    class CDlg, public QDialog
    {
    public:
      CDlg(QWidget *parent = 0);
      virtual void resizeEvent(QResizeEvent *);
    };
     
    CDlg::CDlg(QWidget */*parent*/):
    {
      // positionnement de quelques elements sur la fénêtre
      // sans au préalable utiliser le parametre parent"
    }
     
    void CDlg::resizeEvent(QResizeEvent */*tEvent*/)
    {
      // Aucune activité
    }
    Cela ne change pas la déclaration des fonctions, mais cela retire les noms des variables ( donc plus accéssible ) donc le compilo ne voit pas que l'on utilise pas les variables.
    Si vous voulez utiliser les variables il faudra décommenter le code.

    Pour les autres questions, je sais pas ... je dirai pour la 2, de faire un recentrage à la main ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 72
    Par défaut
    Merci pour ton aide LittleWhite

    Ta méthode marche parfaitement, seleument, je croyais qu'en C++, tous les paramètres devraient
    être nommés lors de la definition d'une fonction. Pas comme dans les prototypes ou seul les types suffissent.

    Pour le point 2) , j'ai déjà trouvé une solution.
    J'ai simplement utilisé la methode "QWidget::move(int, int)" pour recentrer ma boite de dialogue

    Par contre, le point 3) reste toujours un mystère

    @@@ ++++

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Pour le nommage, c'est vrai que si on utilise les variables. Mais là, vous ne voulez pas les utiliser, donc pas de nommage, donc le définition ( signature ) de la fonction reste identique, mais pas les warnings comme quoi on utilise pas tout. Donc ce n'est pas un problème en C++

    Le 3, je pense à un scale si possible, mais je m'y connais que trop peu dans ce sujet là
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut
    pour l'impression regarde du coté de la méthode SetFullPage() de la classe QPrinter, j'ai pas eu l'occasion de tester mais c'est une piste.

    sinon un rescale de l'ensembnle de ton widget est surement possible

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Hello,

    1) Il faut passer la variable "parent" au constructeur parent ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CDlg::CDlg(QWidget *parent): QDialog(parent)
    {
      // positionnement de quelques elements sur la fénêtre
      // sans au préalable utiliser le parametre parent"
    }
    Sinon, pour ne pas avoir à commenter ainsi, il y a aussi la macro Q_UNUSED qui sert exactement à enlever ce warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CDlg::CDlg(QWidget *parent)
    {
      // positionnement de quelques elements sur la fénêtre
      // sans au préalable utiliser le parametre parent"
      Q_UNUSED(parent);
    }
    Mais normalement, il faut passer le widget parent au constructeur de QDialog (code précédent).

    2)
    Du coup, ma boite de dialogue n'est plus centrée dans la fénêtre principale. Elle apparait maintenant à l'angle suppérieure gauche de mon écran; ce qui n'est pas le cas sous l'OS Windows.
    Comment pourais-je recentrer ma boite de dialogue sur la fénêtre principale ?
    Note que tu peux passer ces flags en deuxième paramètre du constructeur de QDialog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CDlg::CDlg(QWidget *parent): QDialog(parent, Qt::FramelessWindowHint)
    {
      // positionnement de quelques elements sur la fénêtre
      // sans au préalable utiliser le parametre parent"
    }
    et donc plus besoin d'appeler setWindowFlags().

    Du coup, ma boite de dialogue n'est plus centrée dans la fénêtre principale. Elle apparait maintenant à l'angle suppérieure gauche de mon écran; ce qui n'est pas le cas sous l'OS Windows.
    Comment pourais-je recentrer ma boite de dialogue sur la fénêtre principale ?
    Ce n'est pas plutôt lié au fait que ta boite de dialogue ne reçoit pas comme parent ta fenêtre principale ? N'ayant aucun parent, elle ne se centre pas par rapport à quelqu'un... d'où l'utilité de passer le parent au constructeur de QDialog

    3)
    Toujours dans mon application, je désire faire une impression.
    Sur un widget, je réalise tout un tas de dessin . Vu que les dimensions de mon widget depassent de loin celles d'un format A4, l'integralité des dessins n'est pas imprimée.
    Comment peut-on se rassurer que les dimensions (en pixels) d'un Widget équivalent à celles (en millimetres) d'un papier A4. ?
    Je ne crois pas que ce soit possible, parce qu'une feuille A4 est exprimée en minimètres, alors que le nombre de pixels pour une distance donnée (ex : la largeur d'une feuille A4) est variable car cela dépend du DPI - il me semble.

    Mieux encore, quelqu'un aurait-il une autre astuce ?
    Tu peux normalement récupérer la taille d'une page et donc adapter ton code de dessin en fonction de ça (mise à l'échelle).

  7. #7
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Les fonctions QPaintDevice::widthMM() et QPaintDevice::heightMM() retournent les dimensions en millimètre d'une zone.

    Attention cependant à ce que souligne la doc (http://qt.developpez.com/doc/4.5/qpaintdevice/#heightmm) :

    "Due to platform limitations it may not be possible to use this function to determine the actual physical size of a widget on the screen."

    A cause des limitations de la plateforme utilisée, il peut être impossible de récupérer la taille d'un widget affiché à l'écran.


    A voir ce que ça vaut et si tu peux l'utiliser pour scaler correctement tes items.

    QPrinter reste à mon avis la meilleure solution, puisque c'est une classe dédiée à ce que tu souhaite faire.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 72
    Par défaut
    Salut à tous et surtout merci pour vos aides précieuses.
    Maintenant, j'ai les idées un peu plus claires.

    En ce qui conserne l'appel de ma boite de dialogue, j'ai entre temps passé le widget parent au contructeur de QDialog
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CDlg::CDlg(QWidget *parent): QDialog(parent, Qt::FramelessWindowHint)
    {
      // positionnement de quelques elements sur la fénêtre
      // sans au préalable utiliser le parametre parent"
    }
    Maintenant, la boite de dialogue n'apparait plus. Chose curieuse qui doit certainement être liée a l'OS.
    Pour centrer la boite de dialogue sur l'écran, j'ai utilisé une autre méthode qui semble bien fonctionnée. En effet, j'ai reussi
    à obtenir les dimensions de mon écran et ensuite, à l'aide de "move(int, int)" j'ai déplacé ma boite de dialogue au centre.
    Biensûr après avoir effectué des calculs

    Revenons à l'impression
    J'ai pu redimentionner mon widget si bien qu'en appelant les méthodes QPaintDevice::widthMM() et QPaintDevice::heightMM(),
    j'obtiens effectivement les dimensions d'un format A4. Qu'a cela ne tienne, l'impression n'est toujours pas OK. Je crois que je ferai
    une mise à l'échelle en dessinant sur mon QPrinter.

    Une fois de plus, merci merci

  9. #9
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Pour ton QDialog :

    Le lien de parenté entre QWidgets défini (entre autre) les zones dans lesquelles les items seront dessinés.

    Exemple :
    - A et B sont des QWidgets et A est le parent de B => B sera dessiné dans A.

    - A est un QFrame (qui étend de QWidget et qui a ses propriétés supplémentaires) et B est un QDialog (qui étend de QWidget et qui a ses propriétés supplémentaires), et A est le parent de B = > B sera dessiné dans A, tout en respectant les propriétés liées aux classes A et B.

    Extrait de la doc de QDialog : "A dialog is always a top-level widget, but if it has a parent, its default location is centered on top of the parent. It will also share the parent's taskbar entry."

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je ne sais pas si tu as bien compris que la doc que tu cites expliques justement qu'un QDialog n'est jamais dessiné dans une autre fenêtre mais est toujours top-level. Le fait de donner un parent à un QDialog fait juste que la QDialog se postionne toute seule au centre de ce widget, mais reste indépendante / au dessus.

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

Discussions similaires

  1. [Inno setup/IsTool]Diverses questions
    Par marsup54 dans le forum Installation, Déploiement et Sécurité
    Réponses: 14
    Dernier message: 18/07/2006, 10h11
  2. [HTML] Diverses questions sur le HTML
    Par Ekin0X dans le forum Balisage (X)HTML et validation W3C
    Réponses: 15
    Dernier message: 29/06/2006, 10h46
  3. Réponses: 18
    Dernier message: 04/04/2006, 14h31
  4. C++ diverses questions concernant directX
    Par TERRIBLE dans le forum DirectX
    Réponses: 5
    Dernier message: 05/10/2005, 23h09
  5. Diverse question ...
    Par Dims dans le forum Développement
    Réponses: 11
    Dernier message: 13/01/2004, 15h29

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