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

Discussion :

Glisser-déposer

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Par défaut Glisser-déposer
    Bonjour/Bonsoir,

    Après plus de 20h d´essais et de recherche sur internet, je me permets de venir vous demander de l´aide.

    J´ai crée une interface graphique ayant pour but de bouger un rectangle dans un graphicsscene et d´éviter certains objets déjà présent. Pour la dernière opération, je dois récupérer les coordonnées du rectangle lors de chaque mouvement. C´est ici que ca coince et que j´ai besoin de votre aide.

    Je vous mets mon code source.

    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
    43
    44
    45
    46
    47
    48
    49
    #include "dialog.h"
    #include "ui_dialog.h"
     
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
        scene=new QGraphicsScene(this);
        ui->graphicsView->setScene(scene);
        scene->setSceneRect(QRectF(0,0,100,100));
        ui->graphicsView->setAlignment(Qt::AlignTop | Qt::AlignLeft);
     
     
       scene->addEllipse(QRectF(100,50 , 3,3),QPen(Qt::red),QBrush(Qt::red));
       scene->addEllipse(QRectF(125,220 , 2,2),QPen(Qt::red),QBrush(Qt::red));
       scene->addEllipse(QRectF(300,230 , 3,3),QPen(Qt::red),QBrush(Qt::red));
       scene->addEllipse(QRectF(100,100 , 3,3),QPen(Qt::red),QBrush(Qt::red));
       scene->addRect(QRectF(130, 230, 40, 5), QPen(Qt::red), QBrush(Qt::red));
     
    scene->addRect(QRectF(100, 100, -2, 50), QPen(Qt::red), QBrush(Qt::red));
     
        square=new MySquare();
     
        scene->addItem(square);
     
        ui->tableWidget->horizontalHeader()->resizeSection(0, 90);
        ui->tableWidget->horizontalHeader()->resizeSection(1, 100);
        ui->tableWidget->horizontalHeader()->resizeSection(2, 100);
        ui->tableWidget_2->horizontalHeader()->resizeSection(0, 90);
        ui->tableWidget_2->horizontalHeader()->resizeSection(1, 100);
        ui->tableWidget_2->horizontalHeader()->resizeSection(2, 100);
     
     
            for (int i=0;i<6;i++)
            {
                ui->tableWidget->verticalHeader()->resizeSection(i, 20);
    ui->tableWidget_2->verticalHeader()->resizeSection(i, 20);
    }
     
            qDebug()<< square->scenePos();
     
     
    }
     
    Dialog::~Dialog()
    {
        delete ui;
    }
    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
    #ifndef DIALOG_H
    #define DIALOG_H
     
    #include <QDialog>
    #include <QtCore>
    #include <QtGui>
    #include <mysquare.h>
    #include <QDoubleSpinBox>
    #include <QPushButton>
    #include <QInputDialog>
     
     
     
    namespace Ui {
    class Dialog;
    }
     
    class Dialog : public QDialog
    {
        Q_OBJECT
     
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
     
    private:
        Ui::Dialog *ui;
        QGraphicsScene *scene;
        MySquare *square;
     
     
     
     
     
     
     
     
     
    };
     
    #endif // DIALOG_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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #ifndef MYSQUARE_H
    #define MYSQUARE_H
    #include <Qpainter>
    #include <QGraphicsItem>
    #include <QDebug>
    #include <QPoint>
    #include <QCursor>
    #include <QInputDialog>
    #include <QLabel>
     
     
    class MySquare : public QGraphicsItem
    {
    public:
        MySquare();
     
     
    MySquare *square;
        QRectF boundingRect() const;
     
        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
        bool Pressed;
        bool erreur;
     
     
     
    protected:
     
        void mousePressEvent(QGraphicsSceneMouseEvent *event);
        void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
     
     
     
     
     
    signals:
    void clicked(const QPoint&);
     
     
     
     
    };
     
    #endif // MYSQUARE_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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include "mysquare.h"
     
    MySquare::MySquare()
    {
     
       Pressed=false;
       erreur=true;
     
     
       setFlag(ItemIsMovable);
     
    }
     
    QRectF MySquare::boundingRect() const
    {
     
        return QRectF(0,0,100,100);
     
     
    }
     
    void MySquare::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        QRectF rec = boundingRect();
        QBrush brush (Qt::blue);
     
        if (Pressed)
            {
            brush.setColor(Qt::darkGray);
        }
        else
            {
            brush.setColor(Qt::gray);
     
        }
     
        painter->fillRect(rec,brush);
        painter->drawRect(rec);
     
     
     
    }
     
    void MySquare::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
        Pressed = true;
     
        QPoint *p = new QPoint(QCursor::pos());
     
       // qDebug() << p->y();
     
     
     
        update();
        QGraphicsItem::mousePressEvent(event);
     
     
     
     
    }
     
     
     
    void MySquare::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
    {
     
        Pressed = false;
        update();
        QGraphicsItem::mouseReleaseEvent(event);
     
    }
    Ce fameux rectangle s´appelle "square". Soyez indulgent, je ne suis pas un pro dans la programmation Qt Merci d´avance pour votre aide et bonne soirée

  2. #2
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Par défaut
    bonjour,

    Juste une remarque :
    si tu veux retourner la position du curseur de la souris dans un évènement, utilise event->pos() plutot que QCursor::pos().

    Ce dernier appel est un appel sans objet existant, ne doit donc pas faire grand chose.

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Citation Envoyé par vinceouille Voir le message
    Ce dernier appel est un appel sans objet existant, ne doit donc pas faire grand chose.
    http://qt-project.org/doc/qt-4.8/qcursor.html#pos

  4. #4
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Par défaut
    La classe de l'objet QCursor existe mais pas l'objet. Donc, à mon avis, donner la position d'un objet inexistant est difficile. Si l'objet existe tel que
    QCursor MyCursor,
    MyCursor.pos() a un sens

    Mais QCursor::pos() n'a pas de sens en dehors de tout objet QCursor existant et oesterlj l'utilise en dehors d'un quelconque objet QCursor...

    Mais peut être que je me trompe.

    Dans tout les cas event.pos() marche très bien.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Il faut te renseigner sur ce qu'est une fonction statique en C++ alors QCursor::pos() retourne la position absolue du curseur sur l'écran. Effectivement event->pos() sera peut-être plus pratique car il donnera une position relative à l'objet MySquare.

  6. #6
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 45
    Par défaut
    En effet, je ne savais pas que pos() pouvait être une fonction statique (d'ailleurs comment fait on pour repérer les fonction statique dans le doc).

    Si il nous retourne la absolue dans l'écran, il faut donc y faire très attention dans son exploitation dans le cadre d'une QGraphicsview. Il est même plutôt déconseillé de l'utiliser si on veut utiliser la position dans la scene ou la vue ou par rapport à d'autres items ! A moins peut être de jouer avec le conversion de coordonnée.

    Il faut mieux utiliser event->pos() ou event->screenPos() dans le cas d'un SceneEvent. Et je trouve ça plus "propre" (avis subjectif)

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/02/2006, 14h33
  2. Listes Simples et propriétés / Glisser déposer
    Par MeRc|LeSs dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 03/12/2005, 23h14
  3. Paramétrage du glisser-déposer selon l'application cible
    Par annedeblois dans le forum Windows
    Réponses: 3
    Dernier message: 17/10/2005, 21h57
  4. Glisser déposer sur formulaire
    Par norvel dans le forum Access
    Réponses: 5
    Dernier message: 03/10/2005, 11h20
  5. [MFC] Glisser/Déposer dans une CView
    Par octopus984 dans le forum MFC
    Réponses: 2
    Dernier message: 26/04/2005, 10h15

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