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 :

Pas d'événement pour un QGraphicsProxyWidget ajouté dans un QGraphicsItemGroup [Graphics View]


Sujet :

Qt

  1. #1
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut Pas d'événement pour un QGraphicsProxyWidget ajouté dans un QGraphicsItemGroup
    Bonjour,

    Difficile de donner un titre court au problème que je rencontre. Pour simplifier j'ai une vue dérivée de QGraphicsView. Dans celle-ci j'instancie et j'ajoute à sa scène un QGraphicsItemGroup. Dans ce groupe il y a notamment un QGraphicsProxyWidget qui embarque un bête QPushButton. Le soucis rencontré et que ce QPushButton est complétement inefficient : il n'émet plus de signaux et ne semble plus recevoir l'événement "moussePressEvent" (ou son équivalent dans une scène).

    Un peu de pseudo-code simplifié pour illustrer :

    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
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    #include <QGraphicsItemGroup>
    #include <QGraphicsProxyWidget>
    #include <QPushButton>
     
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
     
        ui->graphicsView->setScene(new QGraphicsScene);
     
        QGraphicsProxyWidget* proxy = new QGraphicsProxyWidget();
        QPushButton* btn = new QPushButton();
        proxy->setWidget(btn);
     
        QGraphicsItemGroup* group = new QGraphicsItemGroup();
        group->addToGroup(proxy);
     
        ui->graphicsView->scene()->addItem(group);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    Les zValue sont okay, les macros Q_OBJECT qui peuvent expliquer ce genre de soucis dans d'autres configurations sont présentes là ou c'est nécessaire.
    Et si je sors mon QGraphicsProxyWidget du groupe, plus de soucis, le bouton répond normalement.

    A force de recherche, j'ai pu tomber sur une fonction deprecated maintenant: void setHandlesChildEvents(bool enabled) qui semblait adaptée pour résoudre mon soucis mais je ne trouve pas d'équivalent en 4.7.3..

    Merci de votre aide !


    [EDIT] MAJ du code pour le rendre plus lisible.. Je commence à me demander si je suis pas tombé sur un bug de Qt.. :/

  2. #2
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    Trouvé !

    En fait il semblerait que ce soit le comportement voulu (note à moi même : RTFM).

    A QGraphicsItemGroup is a special type of compound item that treats itself and all its children as one item (i.e., all events and geometries for all children are merged together).
    La solution est donc de dériver de QGraphicsItem. Ça suppose bien sur de surdéfinir boundingRect() et paint() , ce que j'ai fait de cette manière :


    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
     
     
    QRectF MyGraphicsItem::boundingRect() const
    {
    	QRectF bRect;
    	foreach (QGraphicsItem* childItem, childItems())
    	{
    		bRect = bRect.united(childItem->boundingRect());
    	}
    	return bRect;
    }
     
     
    void MyGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem* style, QWidget* widget)
    {
    	foreach (QGraphicsItem* childItem, childItems())
    	{
    		childItem->paint(painter, style, widget);
    	}
    }

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 02/10/2014, 09h37
  2. Je ne trouve pas l'option pour changer l'âge dans le profil
    Par Marc22 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 17/05/2010, 11h05
  3. Bouton pour confirmer un ajout dans une table sous Access
    Par cestimagik dans le forum Access
    Réponses: 3
    Dernier message: 31/12/2006, 10h32
  4. [MySQL] Php, je ne comprends pas comment faire pour introduire des données dans une table
    Par Liondd dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 14/12/2006, 12h53

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