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 :

setMask - problème frameGeometry


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 setMask - problème frameGeometry
    Salut,

    Suite à un poste dans le forum débuter, j'ai voulu m'amuser avec la fonction setMask de QWidget(). Cependant, je rencontre des problèmes, qui je pense viennent du fait que Qt ne récupèrent pas les bonnes coordonnées de la fenêtre (frameGeometry()).

    Comme je pense que cela est très lié au window manager de l'OS utilisé, je joins un petit bout de code, pour que vous testiez.

    Pour ma part, j'ai un XP pro 32 bits.

    Merci de vos retours,

    G.
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Citation Envoyé par Gulish Voir le message
    Salut,

    Suite à un poste dans le forum débuter, j'ai voulu m'amuser avec la fonction setMask de QWidget(). Cependant, je rencontre des problèmes, qui je pense viennent du fait que Qt ne récupèrent pas les bonnes coordonnées de la fenêtre (frameGeometry()).

    Comme je pense que cela est très lié au window manager de l'OS utilisé, je joins un petit bout de code, pour que vous testiez.

    Pour ma part, j'ai un XP pro 32 bits.

    Merci de vos retours,

    G.
    framegeometry() est dans l'espace globale.
    mask et dans l'espace de la widget.
    C'est ca ton problème.

    remplace QRegion all(framegeometry()) par QRegion all(this->rect()); et ca marche

  3. #3
    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
    remplace QRegion all(framegeometry()) par QRegion all(this->rect()); et ca marche
    Oui mais non !

    Mon but est de garder la widget avec les borders et la title bar. Hors rect() ne renvoit que l'espace interne de la widget.

    J'ai essayé de faire des mapToGlobal sur les coordonnées du rectangle de la souris, afin que toutes les coordonées soient globales, mais ça ne marche toujours pas.

    Je continuerai demain, là je rentre à ma maison .

    G.

  4. #4
    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
    si tu utilise un mask, la widget ne doit pas obligatoirement être frameless??
    [edit]
    il faut faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QPoint  p =mapFromGlobal ( frameGeometry().topLeft() ) ;
    QRect rect(p,frameGeometry().size());
    c'est le point haut gauche qu'il faut remapper.

    Par contre du coup j'ai une fenêtre avec les bord d'un windows classique, sans style.
    A mon avis, le mieux est de refaire sois même la bar du dessus car
    http://qt.developpez.com/doc/4.4/qwidget/#setmask
    If the region includes pixels outside the rect() of the widget, window system controls in that area may or may not be visible, depending on the platform.
    Y as un exemple
    ici :
    http://www.developpez.net/forums/d59...titre-windows/

  5. #5
    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, ça marche comme ça. Et en effet, le style des fenêtres disparaît.
    Je joins le code complet, au cas où ça puisse servir à quelqu'un.

    tbi.h
    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
    ifndef TBI_H
    #define TBI_H
     
    #include <QtGui>
     
    class TBI : public QWidget
    {
        Q_OBJECT
     
    public:
        TBI( QWidget * parent = 0, Qt::WindowFlags f = 0 );
        void mousePressEvent(QMouseEvent* event);
        void mouseReleaseEvent(QMouseEvent* event);
        void setOpenArea(int,int,int,int);
        QRect getOpenArea();
     
    private:
     
    	QPoint pressedPos; // Position de la souris à l'enfoncement du bouton
    	QPoint releasedPos; // Position de la souris au relachement du bouton
     
    	QRect openArea;
    };
     
    #endif // TBI_H
    tbi.cpp
    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
    #include "tbi.h"
     
    TBI::TBI(QWidget *parent, Qt::WindowFlags f)
        :  QWidget  (parent,f)
    {
    	openArea.setRect(0,0,0,0);
    }
     
    void TBI::mousePressEvent(QMouseEvent* event) {
    	this->clearMask();
    	this->updateGeometry();
    	this->repaint();
     
    	pressedPos = event->pos();
     
     
    }
     
    void TBI::mouseReleaseEvent(QMouseEvent* event) {
     
    		releasedPos = event->pos();
    		setOpenArea(pressedPos.x(),pressedPos.y(),releasedPos.x()-pressedPos.x(),releasedPos.y()-pressedPos.y());
    }
     
    void TBI::setOpenArea(int x, int y, int w, int h) {
    	openArea.setRect(x,y,w,h);
    	openArea = openArea.normalized();
    	QPoint  p =mapFromGlobal ( frameGeometry().topLeft() ) ;
    	QRect rectAll(p,frameGeometry().size());
    	QRegion regAll(rectAll);
    	QRegion myRegion(openArea);
    	this->setMask(regAll.subtracted(myRegion));
    	this->updateGeometry();
     
    	this->repaint();
    }
     
    QRect TBI::getOpenArea() {
    	return openArea;
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "tbi.h"
    #include <QApplication>
     
    int main(int argc, char* argv[])
    {
    	QApplication app(argc, argv);
    	TBI tbi;
    	tbi.show();
    	return app.exec();
    }
    test.pro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ######################################################################
    # Automatically generated by qmake (2.01a) mar. 6. janv. 16:23:22 2009
    ######################################################################
     
    TEMPLATE = app
    TARGET = 
    DEPENDPATH += .
    INCLUDEPATH += .
    CONFIG += console
     
    # Input
    HEADERS += tbi.h
    SOURCES += main.cpp tbi.cpp
    G.

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

Discussions similaires

  1. [FLASH 8] Problème setMask
    Par segphault dans le forum Flash
    Réponses: 4
    Dernier message: 11/12/2005, 20h31
  2. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  3. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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