Projet

Général

Profil

Utilisation de abuleduboutonv0

Objectif:
  • Avoir des boutons graphiques
  • Avoir des "zones sensibles" rectangulaires + rotation
  • Dans une version future avoir des zones sensibles en forme polygonales (ou mieux)
  • Associer une animation à un bouton pour qu'il puisse se déplacer (utile si c'est une image pour calapa par exemple)
  • Associer une 2° image pour l'état "bouton sélectionné" (ou bouton cliqué, c'est vous qui implémentez la méthode)
  • Associer un drag & drop possible
Utilisation de la classe abuleduboutonv0
  • Application de tests et de démonstration:
bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/leterrier/leterrier-developpeu/abuleduboutonv0-test
cd abuleduboutonv0-test
bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/leterrier/leterrier-developpeu/abuleduboutonv0

Bouton + rotation + animation

    QGraphicsScene* dessin = new QGraphicsScene(this);
    m_ui->grvVue->setScene(dessin);
    //Positionne l'origine des objets ajoutés dans le QGraphicsView avec le (0,0) en haut à gauche...
    //... il est au centre du QGraphicsView sinon
    m_ui->grvVue->setAlignment(Qt::AlignLeft | Qt::AlignTop);

    AbulEduBoutonV0* bouton = new AbulEduBoutonV0("Bonjour");//,m_ui->grvVue);
    bouton->QGraphicsItem::setCursor(Qt::PointingHandCursor);
    bouton->setImage(QPixmap("./will-let.png"));
    bouton->rotate(45);
    //bouton->QPushButton::setCursor(Qt::PointingHandCursor);
    dessin->addItem(bouton);

    AbulEduBoutonV0* bouton2 = new AbulEduBoutonV0("Hello");//,m_ui->grvVue);
    bouton2->QGraphicsItem::setCursor(Qt::PointingHandCursor);
   // bouton2->QPushButton::setCursor(Qt::PointingHandCursor);
    bouton2->setImage(QPixmap("./will-win.png"));
    dessin->addItem(bouton2);

   connect(bouton2,SIGNAL(clicked()),this,SLOT(Bonjour_clicked()));

   //Anime le bouton
   QPropertyAnimation* animation = new QPropertyAnimation(bouton,"pos");
   animation->setDuration(3000);
   animation->setKeyValueAt(0,QPoint(10,10));
   animation->setKeyValueAt(0.25,QPoint(100,50));
   animation->setKeyValueAt(0.5,QPoint(150,0));
   animation->setKeyValueAt(0.75,QPoint(75,50));
   animation->setKeyValueAt(1,QPoint(10,10));
   //animation->setStartValue(QPoint(0,0));
   //animation->setEndValue(QPoint(300,0));
   animation->start();

Bouton à deux états

Si vous voulez "marquer" votre lapin (toujours dans calapa) lorsque vous cliquez dessus il suffit d'associer un slot au signal clicked et d'utiliser la 2° image

   QGraphicsScene* dessin2 = new QGraphicsScene(this);
   m_ui->grvChangeEtat->setScene(dessin2);

   AbulEduBoutonV0* bouton2a = new AbulEduBoutonV0("ChangeImage");
   bouton2a->QGraphicsItem::setCursor(Qt::PointingHandCursor);
   bouton2a->setImageNormal(QPixmap("./will-let.png"));
   bouton2a->setImageSelect(QPixmap("./will-win.png"));
   //bouton->QPushButton::setCursor(Qt::PointingHandCursor);
   dessin2->addItem(bouton2a);
   connect(bouton2a,SIGNAL(clicked()),this,SLOT(ChangeImage()));

.../...

void MainWindow::ChangeImage()
{
    //On sait qu'on a clique sur un AbulEduBoutonV0 ... on peut donc le caster sans soucis
    AbulEduBoutonV0 * btn = static_cast<AbulEduBoutonV0 * >(sender());
    if(m_numimage == 0)
        m_numimage = 1;
    else
        m_numimage = 0;
    btn->switchImage(m_numimage);
}

Drag & Drop "basique"

   QGraphicsScene* dessin3 = new QGraphicsScene(this);
   m_ui->grvDragAndDrop->setScene(dessin3);

   AbulEduBoutonV0* bouton3a = new AbulEduBoutonV0("Drag");
   bouton3a->QGraphicsItem::setCursor(Qt::PointingHandCursor);
   bouton3a->setImageNormal(QPixmap("./will-let.png"));
   bouton3a->setPos(50,50);
   bouton3a->setDragAndDrop(true);
   dessin3->addItem(bouton3a);

   AbulEduBoutonV0* bouton3b = new AbulEduBoutonV0("Drop");
   bouton3b->QGraphicsItem::setCursor(Qt::PointingHandCursor);
   bouton3b->setPos(10,10);
   bouton3b->setDebug(true);
   bouton3b->resize(50,50);
   bouton3b->setDragAndDrop(true);
   bouton3b->setHighlightColor("#aeffff");
   dessin3->addItem(bouton3b);

Drag & Drop "évolué"

Peut-être que vous voulez faire plusieurs catégories de bouton drag & drop, par exemple une série de boutons "vide" mais qui n'accepterait que des lapins et une autre série de boutons "vides" qui n'accepteraient que des éléphants... c'est la propriété setDragMimeCode qu'il faut utiliser en ce cas. Dans l'exemple ci-dessous la zone "Elephant1Destination" n'acceptera pas les objets provenant d'un drag & drop dont l'origine serait autre chose qu'un elephant.

    AbulEduBoutonV0* boutonED0 = new AbulEduBoutonV0("Elephant1Destination");
    boutonED0->setDragAndDrop(true);
    boutonED0->setDragMimeCode("elephant");

    AbulEduBoutonV0* boutonL0 = new AbulEduBoutonV0("Lapin1");
    boutonL0->setDragAndDrop(true);
    boutonL0->setDragMimeCode("lapin");

    AbulEduBoutonV0* boutonLD0 = new AbulEduBoutonV0("Lapin1Destination");
    boutonLD0->setDragAndDrop(true);
    boutonLD0->setDragMimeCode("lapin");

Drag & Drop "déplacement" ou "copie"

Il peut-être intéressant d'avoir des drag & drop en mode copie et d'autres en mode déplacement.

    // ============== Exemple de bouton texte à déplacer
    AbulEduBoutonV0* bouton = new AbulEduBoutonV0("TexteSource");
    bouton->setCursor(Qt::PointingHandCursor);
    bouton->setDragAndDrop(true);
    bouton->setDragAndDropMode(Qt::MoveAction);
    bouton->setPlainText(trUtf8("déplace"));
    bouton->setDragMimeCode("TypeDeBoutonTexte");
    bouton->setPos(0,0);
    dessin->addItem(bouton);

    AbulEduBoutonV0* bouton2 = new AbulEduBoutonV0("TexteDestination");
    bouton2->setCursor(Qt::PointingHandCursor);
    bouton2->setDragAndDrop(true);
    bouton2->setPos(0,100);
    bouton2->setPlainText("");
    bouton2->setDragMimeCode("TypeDeBoutonTexte");
    bouton2->setDebug(true);
    dessin->addItem(bouton2);

    // ============== Exemple de bouton texte à copier
    bouton = new AbulEduBoutonV0("TexteSource2");
    bouton->setCursor(Qt::PointingHandCursor);
    bouton->setDragAndDrop(true);
    bouton->setDragAndDropMode(Qt::CopyAction);
    bouton->setPlainText("copie");
    bouton->setDragMimeCode("TypeDeBoutonTexte2");
    bouton->setPos(100,0);
    dessin->addItem(bouton);

    bouton2 = new AbulEduBoutonV0("TexteDestination2");
    bouton2->setCursor(Qt::PointingHandCursor);
    bouton2->setDragAndDrop(true);
    bouton2->setPos(100,100);
    bouton2->setPlainText("");
    bouton2->setDebug(true);
    bouton2->setDragMimeCode("TypeDeBoutonTexte2");
    dessin->addItem(bouton2);
    // ============== Exemple de bouton image avec rollover + image qui suit à déplacer
    bouton = new AbulEduBoutonV0("ImageSource");
    bouton->setCursor(Qt::PointingHandCursor);
    bouton->setImageNormal(QPixmap("/usr/share/icons/Tango/32x32/apps/browser.png"));
    bouton->setImageRollOver(QPixmap("/usr/share/icons/Tango/32x32/apps/preferences-desktop-screensaver.png"));
    bouton->resize(32,32);
    bouton->setDragAndDrop(true);
    bouton->setDragAndDropMode(Qt::MoveAction);
    bouton->setDragMimeCode("TypeDeBoutonImage");
    bouton->setPos(200,0);
    dessin->addItem(bouton);

    bouton2 = new AbulEduBoutonV0("ImageDestination");
    bouton2->setCursor(Qt::PointingHandCursor);
    bouton2->setDragAndDrop(true);
    bouton2->setPos(200,100);
    bouton2->setDragMimeCode("TypeDeBoutonImage");
    bouton2->setDebug(true);
    dessin->addItem(bouton2);
Redmine Appliance - Powered by TurnKey Linux