Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QGraphicItems c++ setAncorPoint crash!
Forum Updated to NodeBB v4.3 + New Features

QGraphicItems c++ setAncorPoint crash!

Scheduled Pinned Locked Moved Unsolved General and Desktop
10 Posts 4 Posters 445 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • gfxxG Offline
    gfxxG Offline
    gfxx
    wrote on last edited by gfxx
    #1

    I've subclass 2 graphics items and use it for play a sort of checkers game using mause drag event and colliding item macro .... checkers is square and I check when two corner point collide ... if touch bool var is active and a checkbutton is active I archive the paint action on scene .... sometime, after a scene->clear and after call some new event on scene obtain an horrible crash without particular indication because need run app outside qrcreator .... I insert a lot of debug point but not understand why app crash ... everyn time app crash on point in evidence on my void (see downhere):

    void MainWindow::testYewDrawMode(bool touch)
    {
        //bool ttouch = touch;
    
        qDebug() << Q_FUNC_INFO << " testYewDrawMode(bool touch) ??? CRASH??? -> " << touch;
    
    
        if(Squaret.empty() && !touch)
        {
            //ui->Square_touch_insert->setChecked(false);
            //ui->Square_touch_insert->setEnabled(false);
            //return;
            qDebug() << Q_FUNC_INFO << "Squaret.empty() ????????? why?";
    
        }
        else
        {
            qDebug() << Q_FUNC_INFO << "....dragItemV_cks->setRect....." << TotalOuterSquareSise_XV << ", " << TotalOuterSquareSise_YV;
    
            //QBrush brush_tch(Qt::red, Qt::Dense7Pattern);
            QPen outlineTch(Qt::black);
            outlineTch.setWidth(5);
            dragItemV_cks->setRect(QRectF(0,0, TotalOuterSquareSise_XV, TotalOuterSquareSise_YV));
            dragItemV_cks->setNewrect(QRectF(0,0, TotalOuterSquareSise_XV, TotalOuterSquareSise_YV));
            qDebug() << Q_FUNC_INFO << "dragItemV_cks->setNewrect";
            dragItemV_cks->setImageDim(MainWindow::bxV, int(RealSquareSizeXX*1), int(RealSquareSizeYY*1));
            qDebug() << Q_FUNC_INFO << "dragItemV_cks->setImageDim  , " << int(RealSquareSizeXX*1) << " ,  " << int(RealSquareSizeYY*1);
            dragItemV_cks->setImagePos(int(SxRealOuterRectSizeXV*1), int(UpRealOuterRectSizeXV*1));
            qDebug() << Q_FUNC_INFO << "dragItemV_cks->setImagePos" << "  , " << int(SxRealOuterRectSizeXV*1) << " ,  " << int(UpRealOuterRectSizeXV*1);
            dragItemH_cks->setRect(QRectF(0,0, TotalOuterSquareSise_XH, TotalOuterSquareSise_YH));
            dragItemH_cks->setNewrect(QRectF(0,0, TotalOuterSquareSise_XH, TotalOuterSquareSise_YH));
            //circle->setParentItem(dragItemH_cks);
            dragItemH_cks->setImageDim(MainWindow::bxH, int(RealSquareSizeYY*1), int(RealSquareSizeXX*1));
            qDebug() << Q_FUNC_INFO << "dragItemH_cks->setImageDim  , " << int(RealSquareSizeYY*1) << " ,  " << int(RealSquareSizeXX*1);
            dragItemH_cks->setImagePos(int(SxRealOuterRectSizeXH*1), int(UpRealOuterRectSizeXH*1));
            qDebug() << Q_FUNC_INFO << "dragItemH_cks->setImagePos" << "  , " << int(SxRealOuterRectSizeXH*1) << " ,  " << int(UpRealOuterRectSizeXH*1);
    
            dragItemV_cks->setPos(20,20);
            qDebug() << Q_FUNC_INFO << "....dragItemV_cks->setPos(20,20);.....";
            dragItemV_cks->setAnchorPoint(dragItemV_cks->pos()); ****// here a crash point ...****
            qDebug() << Q_FUNC_INFO << "....dragItemV_cks->setAnchorPoint(dragItemV_cks->pos());.....";
    
            dragItemH_cks->setPos(20,20);
            qDebug() << Q_FUNC_INFO << "....dragItemH_cks->setPos(20,20);.....";
            dragItemH_cks->setAnchorPoint(dragItemH_cks->pos());  ****// here other crash point ...****
            qDebug() << Q_FUNC_INFO << "....dragItemH_cks->setAnchorPoint(dragItemH_cks->pos());.....";
            if(!firstTimeDragItem){
                dragItemV_cks->initializeForm();
                qDebug() << Q_FUNC_INFO << "....dragItemV_cks->initializeForm();.....";
                dragItemH_cks->initializeForm();
                qDebug() << Q_FUNC_INFO << "....dragItemH_cks->initializeForm();.....";
                firstTimeDragItem = true;
            }
    
    
    
    
            if(!scene_cks->items().isEmpty())
            {
                qDebug() << Q_FUNC_INFO << "....!scene_cks->items().isEmpty().....";
                QList<QGraphicsItem*> titem = scene_cks->items();
                for (int tt = 0; tt < titem.size(); tt++)
                {
                    if ((titem[tt]->zValue() > 100) && ((titem[tt]->zValue() < 105)))
                    {
                        scene_cks->removeItem(titem[tt]);
                        qDebug() << Q_FUNC_INFO << "find zvalues 100 - 105";
                    }
                }
            }else{
                 qDebug() << Q_FUNC_INFO << "----scene_cks->items().isEmpty()-----";
            }
    
    
            scene_cks->update();
            qDebug() << Q_FUNC_INFO << "problem in scene_cks update??";
    
    
    
            if(touch)
            {
                scene_cks->SendQuote(true);
                qDebug() << Q_FUNC_INFO << "problem in scene_cks SendQuote(true)??";
    
                if(ui->VSquare_2->isOn)
                {
                    qDebug() << Q_FUNC_INFO << "if(ui->VSquare_2->isOn)??";
                    ui->HSquare_2->setchecked(false);
                    dragItemV_cks->setPos(10,10);
                    dragItemV_cks->setZValue(90);
                    dragItemV_cks->setAnchorPoint(dragItemV_cks->scenePos());
                    //circ->setParentItem(dragItemV_cks);
                    scene_cks->addItem(dragItemV_cks);
                    dragItemH_cks->setNewrect(QRectF(0,0, TotalOuterSquareSise_XV, TotalOuterSquareSise_YV));
                    dragItemV_cks->setHNewrect(QRectF(0,0, TotalOuterSquareSise_YV, TotalOuterSquareSise_XV));
                    dragItemV_cks->setNewrect(QRectF(0,0, TotalOuterSquareSise_XV, TotalOuterSquareSise_YV));
                    //circ->setParentItem(dragItemV_cks);
                    qDebug() << Q_FUNC_INFO << "return from lastSquare VSquare :...." << dragItemV_cks->lastPoint();
                    //qDebug() << Q_FUNC_INFO << "dragItemV_cks->scenePos()  VSquare:...." << dragItemV_cks->scenePos();
                    scene_cks->SetOneSquareStart();
                    scene_cks->SendQuote(false);
                    QTimer::singleShot(10, [=]{ test_clean_predraw(); });
                }
                else if(ui->HSquare_2->isOn)
                {
                    qDebug() << Q_FUNC_INFO << "else if(ui->HSquare_2->isOn)??";
    
                    ui->VSquare_2->setchecked(false);
                    dragItemH_cks->setPos(10,10);
                    dragItemH_cks->setZValue(88);
                    dragItemH_cks->setAnchorPoint(dragItemH_cks->pos());
                    //circle->setParentItem(dragItemH_cks);
                    scene_cks->addItem(dragItemH_cks);
                    dragItemH_cks->setNewrect(QRectF(0,0, TotalOuterSquareSise_XH, TotalOuterSquareSise_YH));
                    dragItemH_cks->setVNewrect(QRectF(0,0, TotalOuterSquareSise_YH, TotalOuterSquareSise_XH));
                    //circle->setParentItem(dragItemH_cks);
                    dragItemV_cks->setNewrect(QRectF(0,0, TotalOuterSquareSise_XH, TotalOuterSquareSise_YH));
                    qDebug() << Q_FUNC_INFO << "return from lastSquare HSquare :...." << dragItemH_cks->lastPoint();
                    //qDebug() << Q_FUNC_INFO << "dragItemV_cks->scenePos()  HSquare:...." << dragItemH_cks->scenePos();
                    scene_cks->SetOneSquareStart();
                    scene_cks->SendQuote(false);
                    QTimer::singleShot(10, [=]{ test_clean_predraw(); });
    
                }
    
                //scene_cks->SetOneSquareStart();
                //scene_cks->SendQuote(false);
                //QTimer::singleShot(10, [=]{ test_clean_predraw(); });
                //scene_cks->setMode(cksScene::DrawLine);
                //scene_cks->enableRectDraw();
                //scene_cks->SetOneSquare();
                //scene_cks->SetOneSquareStart();
            }
            else
            {
                qDebug() << Q_FUNC_INFO << "else if NO (ui->HSquare_2->isOn) && NO if(ui->VSquare_2->isOn)??";
                scene_cks->SendQuote(false);
                //ui->Square_touch_insert->setEnabled(false);
                scene_cks->SetOneSquareStop();
            }
        }
        //ui->Square_touch_insert->setChecked(false);
        qDebug() << Q_FUNC_INFO << "end test draw mode";
    }
    
    
    
    
    
    

    I work on find these error from 2 days whitout particular result ... whitout debugger is quite difficult ... I appreciate any help ... regards

    bkt

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      Did you check that all your pointers point to valid objects ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      gfxxG 1 Reply Last reply
      0
      • M Offline
        M Offline
        mchinand
        wrote on last edited by
        #3

        What class are dragItemV_cks and dragItemH_cks?

        1 Reply Last reply
        0
        • SGaistS SGaist

          Hi,

          Did you check that all your pointers point to valid objects ?

          gfxxG Offline
          gfxxG Offline
          gfxx
          wrote on last edited by
          #4

          @SGaist how can with linux terminal? because not possible use qtcreator debugger ... my app is only a GUI for background app ... these last run only with bash call .... so not run background app my gui app crash for sure because not find the right connection with ....

          Any how my gui app not crash immediately and can use my class for play ... but after call of scene->clear() can use only dragItemV_cks or dragItemH_cks one time and when change class my gui app crash ... it crash everytime on dragItemV_cks->setAnchorPoint (or dragItemH_cks->setAnchorPoint ...)

          regards

          bkt

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #5

            There's no Qt Creator debugger. Qt Creator uses your installed debugger so call it directly from the command line since you are using that to launch your application.
            Since you're on Linux it's usually gdb (the gcc debugger) unless you are using clang in which case it's lldb.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            4
            • gfxxG Offline
              gfxxG Offline
              gfxx
              wrote on last edited by
              #6

              not find error on debugger --- only sigh-fault because memory corruption. So seems some vector not cleared or clear in wrong moment.... I work on it 3/4 hour day from 3 days whitout find my error .... attach dragItemV ( that is equal to dragItemH .... only rectangle 90° one respet firstone .. but same func) ....

              DragItemV_cks.cpp

              #include "DragItemV_cks.h"
              
              #include <QPainter>
              #include <QPointF>
              #include <QDebug>
              #include <QTime>
              #include <QTimer>
              #include "rettangolo.h"
              
              int positiochooser = 0;
              int colourchooser = 0;
              
              bool Hleft=false, Hright=false, Dleft=false, Dright=false, VVerticalBox=false, VHorizinBox=false;
              
              
              DragItemV_cks::DragItemV_cks(QGraphicsItem *parent )
                  :QGraphicsItem(parent), m_dragged(false)
              //QGraphicsRectItem(parent), QObject(parent), m_dragged(false)
              {
                  setFlags( QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsGeometryChanges);
                  setAcceptHoverEvents(true);
                  selectRectItem = false;
                  setCursor(Qt::OpenHandCursor);
              
                  m_pen.setColor(Qt::darkCyan);
                  m_pen.setWidth(3);
                  colourchooser = 0;
              
              
              }
              
              
              QImage DragItemV_cks::Boximg("/home/bleach/project/res/icons/box-qt.png");
              QImage DragItemV_cks::scaleBoximg("/home/bleach/project/res/icons/box-qt.png");
              QPoint DragItemV_cks::ImgPosition(0,0);
              QPointF DragItemV_cks::movepos(0,0);
              QPointF DragItemV_cks::enterpos(0,0);
              bool DragItemV_cks::firstpos = false;
              
              
              void DragItemV_cks::setImageDim(QImage realImage, int dXImage, int dYImage)
              {
                  DragItemV_cks::scaleBoximg = realImage.scaled(dXImage, dYImage , Qt::IgnoreAspectRatio);
              }
              
              void DragItemV_cks::initializeForm()
              {
                  m_pen.setColor(Qt::darkCyan);
                  m_pen.setWidth(3);
                  colourchooser = 0;
              }
              
              void DragItemV_cks::setNewrect(QRectF hkr)
              {
                  m_Newrect.setRect(0,0, hkr.width(), hkr.height());
              }
              
              void DragItemV_cks::setHNewrect(QRectF hNkr)
              {
                  mh_Newrect.setRect(0,0, hNkr.width(), hNkr.height());
              }
              
              
              void DragItemV_cks::setVbool(bool Vbool){
                  if(Vbool){
                      VVerticalBox=true;
                      VHorizinBox=false;
                      qDebug() << "Vbool=TRUE    VVerticalBox=   " << VVerticalBox << "  ||  VHorizinBox=  " << VHorizinBox;
                  }
                  else{
                      VVerticalBox=false;
                      VHorizinBox=true;
                      qDebug() << "Vbool=FALSE    VVerticalBox=   " << VVerticalBox << "  ||  VHorizinBox=  " << VHorizinBox;
                  }
              }
              
              
              
              void DragItemV_cks::setImagePos(int Xspace, int Yspace)
              {
                  DragItemV_cks::ImgPosition.setX(Xspace);
                  DragItemV_cks::ImgPosition.setY(Yspace);
              }
              
              void DragItemV_cks::setAnchorPoint(const QPointF &anchorPoint)
              {
                  this->anchorPoint = anchorPoint;
              }
              
              
              void DragItemV_cks::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
              {
                  m_pen.setColor(Qt::red);
                  update();
              }
              
              void DragItemV_cks::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
              {
                  if(m_pen.color() == Qt::red)
                  {
                      m_pen.setColor(Qt::darkCyan);
                      update();
                  }
              }
              
              void DragItemV_cks::mousePressEvent(QGraphicsSceneMouseEvent *event)
              {
                  enterpos.setX(event->pos().x());
                  enterpos.setY(event->pos().y());
              
              
                  QVector<double> list2;
              
                  QLineF linemtl = QLineF(boundingRect().topLeft(), enterpos);
                  QLineF linemtr = QLineF(boundingRect().topRight(), enterpos);
                  QLineF linembl = QLineF(boundingRect().bottomLeft(), enterpos);
                  QLineF linembr = QLineF(boundingRect().bottomRight(), enterpos);
              
                  list2.append(double(linemtl.length()));
                  list2.append(double(linemtr.length()));
                  list2.append(double(linembl.length()));
                  list2.append(double(linembr.length()));
                  double minM = *std::min_element(list2.constBegin(), list2.constEnd());
                  if(minM == double(linemtl.length())){colourchooser = 1;}
                  else if(minM == double(linemtr.length())){colourchooser = 2;}
                  else if(minM == double(linembl.length())){colourchooser = 3;}
                  else if(minM == double(linembr.length())){colourchooser = 4;}
                  else if((enterpos.x() == 0) && (enterpos.y()==0)){positiochooser = 0; colourchooser = 0;}
                  list2.clear();
              
                  qDebug() << "scelta ancora -m- VERTICAL = " << colourchooser;
              
                  if(selectRectItem)
                  {
                      selectRectItem = false;
                  }
                  else
                  {
                      selectRectItem = true;
                  }
                  m_pen.setColor(Qt::red);
                  update();
              
              }
              
              
              void DragItemV_cks::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
              {
                  m_dragged = true;
                  movepos.setX(event->scenePos().x());
                  movepos.setY(event->scenePos().y());
                  m_pen.setColor(Qt::red);
                  update();
                  QGraphicsItem::mouseMoveEvent(event);
              
              }
              
              /*QVariant DragItemV_cks::itemChange ( GraphicsItemChange change, const QVariant & value )
              {
                  if (change == ItemPositionChange && scene()) {
                      // value is the new position.
                      QPointF newPos = value.toPointF();
                      QRectF rect = scene()->sceneRect();
                      if (!rect.contains(newPos)) {
                          // Keep the item inside the scene rect.
                          newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
                          newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
                          //newPos.setX(rect.topLeft().x());
                          //newPos.setY(rect.topLeft().y());
                          return newPos;
                      }
                  }
                  return QGraphicsItem::itemChange(change, value);
              }*/
              
              void DragItemV_cks::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
              {
                  QPointF thisBox(0,0);
                  positiochooser = 0;
                  int poscounter = 0;
                      qreal min = 0;
                      qreal mis1 = 0;
                      qreal mis2 = 0;
                      qreal mis3 = 0;
                      qreal mis4 = 0;
                      QPointF p;
                      p.setX(event->scenePos().x());
                      p.setY(event->scenePos().y());
              
              
              
              
                      if(m_dragged){
                          QList<QGraphicsItem*> colItems = collidingItems();
                          if(colItems.isEmpty())
                              this->setPos(anchorPoint);
                          else {
                              QGraphicsItem* closestItem = colItems.at(0);
                              qreal shortestDist = 1000000;
                              foreach(QGraphicsItem* item, colItems){
              
                                  switch (colourchooser) {
                                  case 1:
                                      //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                      if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ //&& (item->zValue() > 90) && (item->zValue() < 93)){ //
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
              
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
              
                                          if(min == mis4)
                                          {
                                              this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                              qDebug() << Q_FUNC_INFO << "mis4";
                                          }
                                          if(min == mis2)
                                          {
                                              this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y()));
                                              qDebug() << Q_FUNC_INFO << "mis2";
                                          }
                                          if(min == mis3)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                              qDebug() << Q_FUNC_INFO << "mis3";
                                          }
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 1 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
              
                                      }
                                      else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
              
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
              
                                          if(min == mis4)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y() + m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis4";
                                          }
                                          if(min == mis2)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y()));
                                              qDebug() << Q_FUNC_INFO << "mis2";
                                          }
                                          if(min == mis3)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis3";
                                          }
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 1 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
              
              
                                      }
              
                                      break;
                                  case 2:
                                      //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                      if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
              
                                          if(min == mis1)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                              qDebug() << Q_FUNC_INFO << "mis1";
                                          }
                                          if(min == mis4)
                                          {
                                              this->setPos(QPointF((closestItem->scenePos().x() - (m_Newrect.width() - closestItem->sceneBoundingRect().width())), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                              qDebug() << Q_FUNC_INFO << "mis4";
                                          }
                                          if(min == mis3)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                              qDebug() << Q_FUNC_INFO << "mis3";
                                          }
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 2 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                      }
                                      else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
              
                                          if(min == mis1)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                              qDebug() << Q_FUNC_INFO << "mis1";
                                          }
                                          if(min == mis4)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis4";
                                          }
                                          if(min == mis3)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() + m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis3";
                                          }
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 2 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                      }
                                      //qDebug() << "CASE2: we find case1 item Z value:  " << item->zValue() << "   min equal to ...." << min << ".." << mis1 << ".." << mis2 << ".." << mis3;
              
                                      break;
                                  case 3:
                                      //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                      if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
              
                                          if(min == mis2)
                                          {
                                              this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis2"; /* (ui->HBox_2->isOn) */
                                          }
                                          if(min == mis1)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis1";
                                          }
                                          if(min == mis4)
                                          {
                                              this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() - (m_Newrect.height() - closestItem->sceneBoundingRect().height())));
                                              qDebug() << Q_FUNC_INFO << "mis4";
                                          }
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 3 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                      }
                                      else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
              
                                          if(min == mis2)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis2";
                                          }
                                          if(min == mis1)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis1";
                                          }
                                          if(min == mis4)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y()));
                                              qDebug() << Q_FUNC_INFO << "mis4";
                                          }
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 3 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                      }
                                      //qDebug() << "CASE3: we find case1 item Z value:  " << item->zValue() << "   min equal to ...." << min << ".." << mis1 << ".." << mis2 << ".." << mis3;
              
                                      break;
                                  case 4:
                                      //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                      if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
                                          if(min == mis1)
                                          {
                                              //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()));
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis1";
                                          }
                                          if(min == mis2)
              
                                          {
                                              //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()));
                                              this->setPos(QPointF((closestItem->scenePos().x() - (m_Newrect.width() - closestItem->sceneBoundingRect().width())), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis2";
                                          }
                                          if(min == mis3)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - (m_Newrect.height() - closestItem->sceneBoundingRect().height())));
                                              //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()- this->boundingRect().height()));
                                              qDebug() << Q_FUNC_INFO << "mis3";
              
                                          }
              
                                          //m_p.setX(this->pos().x());
                                          //m_p.setY(this->pos().y());
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 4 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                      }
                                      else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ // && (item->zValue() > 89) && (item->zValue() < 91)){
                                          mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                          mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                          mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                          mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                          if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                          else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                          else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                          else{min = mis4;}
                                          if(min < shortestDist){
                                              shortestDist = min;
                                              closestItem = item;
                                          }
                                          if(min == mis1)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis1";
                                          }
                                          if(min == mis2)
              
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                              qDebug() << Q_FUNC_INFO << "mis2";
                                          }
                                          if(min == mis3)
                                          {
                                              this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                              qDebug() << Q_FUNC_INFO << "mis3";
              
                                          }
              
                                          m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                          poscounter++;
                                          qDebug() << Q_FUNC_INFO << " 4 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                      }
              
                                      break;
                                  default:
                                      this->setPos(anchorPoint);
                                      colourchooser = 0;
                                      qDebug() << Q_FUNC_INFO << " NO FIND ITEM CLOSEST .... ";
              
                                      break;
                                  }
              
                                  //qDebug() << "debugpos ....." << this->pos();
              
              
              
                          }
                              if(poscounter == 0){
                                  this->setPos(anchorPoint);
                                  colourchooser = 0;
                              }
                              else
                              {
                                  //getPos(this->pos());
                                  m_p.setX(this->pos().x());
                                  m_p.setY(this->pos().y());
                                  emit senderRectData(m_p, this->boundingRect(), m_rect);
                                  //qDebug() << "mystupid pos ....." << m_p;
                              }
              
                          }
                          enterpos.setX(0);
                          enterpos.setY(0);
                          colourchooser = 0;
                          m_dragged = false;
                          firstpos = false;
                      }
                      QGraphicsItem::mouseReleaseEvent(event);
                      m_pen.setColor(Qt::green);
                      update();
              
              }
              
              

              bkt

              gfxxG jsulmJ 2 Replies Last reply
              0
              • gfxxG gfxx

                not find error on debugger --- only sigh-fault because memory corruption. So seems some vector not cleared or clear in wrong moment.... I work on it 3/4 hour day from 3 days whitout find my error .... attach dragItemV ( that is equal to dragItemH .... only rectangle 90° one respet firstone .. but same func) ....

                DragItemV_cks.cpp

                #include "DragItemV_cks.h"
                
                #include <QPainter>
                #include <QPointF>
                #include <QDebug>
                #include <QTime>
                #include <QTimer>
                #include "rettangolo.h"
                
                int positiochooser = 0;
                int colourchooser = 0;
                
                bool Hleft=false, Hright=false, Dleft=false, Dright=false, VVerticalBox=false, VHorizinBox=false;
                
                
                DragItemV_cks::DragItemV_cks(QGraphicsItem *parent )
                    :QGraphicsItem(parent), m_dragged(false)
                //QGraphicsRectItem(parent), QObject(parent), m_dragged(false)
                {
                    setFlags( QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsGeometryChanges);
                    setAcceptHoverEvents(true);
                    selectRectItem = false;
                    setCursor(Qt::OpenHandCursor);
                
                    m_pen.setColor(Qt::darkCyan);
                    m_pen.setWidth(3);
                    colourchooser = 0;
                
                
                }
                
                
                QImage DragItemV_cks::Boximg("/home/bleach/project/res/icons/box-qt.png");
                QImage DragItemV_cks::scaleBoximg("/home/bleach/project/res/icons/box-qt.png");
                QPoint DragItemV_cks::ImgPosition(0,0);
                QPointF DragItemV_cks::movepos(0,0);
                QPointF DragItemV_cks::enterpos(0,0);
                bool DragItemV_cks::firstpos = false;
                
                
                void DragItemV_cks::setImageDim(QImage realImage, int dXImage, int dYImage)
                {
                    DragItemV_cks::scaleBoximg = realImage.scaled(dXImage, dYImage , Qt::IgnoreAspectRatio);
                }
                
                void DragItemV_cks::initializeForm()
                {
                    m_pen.setColor(Qt::darkCyan);
                    m_pen.setWidth(3);
                    colourchooser = 0;
                }
                
                void DragItemV_cks::setNewrect(QRectF hkr)
                {
                    m_Newrect.setRect(0,0, hkr.width(), hkr.height());
                }
                
                void DragItemV_cks::setHNewrect(QRectF hNkr)
                {
                    mh_Newrect.setRect(0,0, hNkr.width(), hNkr.height());
                }
                
                
                void DragItemV_cks::setVbool(bool Vbool){
                    if(Vbool){
                        VVerticalBox=true;
                        VHorizinBox=false;
                        qDebug() << "Vbool=TRUE    VVerticalBox=   " << VVerticalBox << "  ||  VHorizinBox=  " << VHorizinBox;
                    }
                    else{
                        VVerticalBox=false;
                        VHorizinBox=true;
                        qDebug() << "Vbool=FALSE    VVerticalBox=   " << VVerticalBox << "  ||  VHorizinBox=  " << VHorizinBox;
                    }
                }
                
                
                
                void DragItemV_cks::setImagePos(int Xspace, int Yspace)
                {
                    DragItemV_cks::ImgPosition.setX(Xspace);
                    DragItemV_cks::ImgPosition.setY(Yspace);
                }
                
                void DragItemV_cks::setAnchorPoint(const QPointF &anchorPoint)
                {
                    this->anchorPoint = anchorPoint;
                }
                
                
                void DragItemV_cks::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
                {
                    m_pen.setColor(Qt::red);
                    update();
                }
                
                void DragItemV_cks::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
                {
                    if(m_pen.color() == Qt::red)
                    {
                        m_pen.setColor(Qt::darkCyan);
                        update();
                    }
                }
                
                void DragItemV_cks::mousePressEvent(QGraphicsSceneMouseEvent *event)
                {
                    enterpos.setX(event->pos().x());
                    enterpos.setY(event->pos().y());
                
                
                    QVector<double> list2;
                
                    QLineF linemtl = QLineF(boundingRect().topLeft(), enterpos);
                    QLineF linemtr = QLineF(boundingRect().topRight(), enterpos);
                    QLineF linembl = QLineF(boundingRect().bottomLeft(), enterpos);
                    QLineF linembr = QLineF(boundingRect().bottomRight(), enterpos);
                
                    list2.append(double(linemtl.length()));
                    list2.append(double(linemtr.length()));
                    list2.append(double(linembl.length()));
                    list2.append(double(linembr.length()));
                    double minM = *std::min_element(list2.constBegin(), list2.constEnd());
                    if(minM == double(linemtl.length())){colourchooser = 1;}
                    else if(minM == double(linemtr.length())){colourchooser = 2;}
                    else if(minM == double(linembl.length())){colourchooser = 3;}
                    else if(minM == double(linembr.length())){colourchooser = 4;}
                    else if((enterpos.x() == 0) && (enterpos.y()==0)){positiochooser = 0; colourchooser = 0;}
                    list2.clear();
                
                    qDebug() << "scelta ancora -m- VERTICAL = " << colourchooser;
                
                    if(selectRectItem)
                    {
                        selectRectItem = false;
                    }
                    else
                    {
                        selectRectItem = true;
                    }
                    m_pen.setColor(Qt::red);
                    update();
                
                }
                
                
                void DragItemV_cks::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
                {
                    m_dragged = true;
                    movepos.setX(event->scenePos().x());
                    movepos.setY(event->scenePos().y());
                    m_pen.setColor(Qt::red);
                    update();
                    QGraphicsItem::mouseMoveEvent(event);
                
                }
                
                /*QVariant DragItemV_cks::itemChange ( GraphicsItemChange change, const QVariant & value )
                {
                    if (change == ItemPositionChange && scene()) {
                        // value is the new position.
                        QPointF newPos = value.toPointF();
                        QRectF rect = scene()->sceneRect();
                        if (!rect.contains(newPos)) {
                            // Keep the item inside the scene rect.
                            newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
                            newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
                            //newPos.setX(rect.topLeft().x());
                            //newPos.setY(rect.topLeft().y());
                            return newPos;
                        }
                    }
                    return QGraphicsItem::itemChange(change, value);
                }*/
                
                void DragItemV_cks::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
                {
                    QPointF thisBox(0,0);
                    positiochooser = 0;
                    int poscounter = 0;
                        qreal min = 0;
                        qreal mis1 = 0;
                        qreal mis2 = 0;
                        qreal mis3 = 0;
                        qreal mis4 = 0;
                        QPointF p;
                        p.setX(event->scenePos().x());
                        p.setY(event->scenePos().y());
                
                
                
                
                        if(m_dragged){
                            QList<QGraphicsItem*> colItems = collidingItems();
                            if(colItems.isEmpty())
                                this->setPos(anchorPoint);
                            else {
                                QGraphicsItem* closestItem = colItems.at(0);
                                qreal shortestDist = 1000000;
                                foreach(QGraphicsItem* item, colItems){
                
                                    switch (colourchooser) {
                                    case 1:
                                        //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                        if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ //&& (item->zValue() > 90) && (item->zValue() < 93)){ //
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                
                                            if(min == mis4)
                                            {
                                                this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                qDebug() << Q_FUNC_INFO << "mis4";
                                            }
                                            if(min == mis2)
                                            {
                                                this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y()));
                                                qDebug() << Q_FUNC_INFO << "mis2";
                                            }
                                            if(min == mis3)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                qDebug() << Q_FUNC_INFO << "mis3";
                                            }
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 1 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                
                                        }
                                        else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                
                                            if(min == mis4)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y() + m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis4";
                                            }
                                            if(min == mis2)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y()));
                                                qDebug() << Q_FUNC_INFO << "mis2";
                                            }
                                            if(min == mis3)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis3";
                                            }
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 1 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                
                
                                        }
                
                                        break;
                                    case 2:
                                        //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                        if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                
                                            if(min == mis1)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                                qDebug() << Q_FUNC_INFO << "mis1";
                                            }
                                            if(min == mis4)
                                            {
                                                this->setPos(QPointF((closestItem->scenePos().x() - (m_Newrect.width() - closestItem->sceneBoundingRect().width())), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                qDebug() << Q_FUNC_INFO << "mis4";
                                            }
                                            if(min == mis3)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                qDebug() << Q_FUNC_INFO << "mis3";
                                            }
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 2 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                        }
                                        else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                
                                            if(min == mis1)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                                qDebug() << Q_FUNC_INFO << "mis1";
                                            }
                                            if(min == mis4)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis4";
                                            }
                                            if(min == mis3)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() + m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis3";
                                            }
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 2 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                        }
                                        //qDebug() << "CASE2: we find case1 item Z value:  " << item->zValue() << "   min equal to ...." << min << ".." << mis1 << ".." << mis2 << ".." << mis3;
                
                                        break;
                                    case 3:
                                        //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                        if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                
                                            if(min == mis2)
                                            {
                                                this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis2"; /* (ui->HBox_2->isOn) */
                                            }
                                            if(min == mis1)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis1";
                                            }
                                            if(min == mis4)
                                            {
                                                this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() - (m_Newrect.height() - closestItem->sceneBoundingRect().height())));
                                                qDebug() << Q_FUNC_INFO << "mis4";
                                            }
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 3 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                        }
                                        else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                
                                            if(min == mis2)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis2";
                                            }
                                            if(min == mis1)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis1";
                                            }
                                            if(min == mis4)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y()));
                                                qDebug() << Q_FUNC_INFO << "mis4";
                                            }
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 3 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                        }
                                        //qDebug() << "CASE3: we find case1 item Z value:  " << item->zValue() << "   min equal to ...." << min << ".." << mis1 << ".." << mis2 << ".." << mis3;
                
                                        break;
                                    case 4:
                                        //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                        if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                                            if(min == mis1)
                                            {
                                                //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()));
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis1";
                                            }
                                            if(min == mis2)
                
                                            {
                                                //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()));
                                                this->setPos(QPointF((closestItem->scenePos().x() - (m_Newrect.width() - closestItem->sceneBoundingRect().width())), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis2";
                                            }
                                            if(min == mis3)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - (m_Newrect.height() - closestItem->sceneBoundingRect().height())));
                                                //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()- this->boundingRect().height()));
                                                qDebug() << Q_FUNC_INFO << "mis3";
                
                                            }
                
                                            //m_p.setX(this->pos().x());
                                            //m_p.setY(this->pos().y());
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 4 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                        }
                                        else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ // && (item->zValue() > 89) && (item->zValue() < 91)){
                                            mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                            mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                            mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                            mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                            if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                            else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                            else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                            else{min = mis4;}
                                            if(min < shortestDist){
                                                shortestDist = min;
                                                closestItem = item;
                                            }
                                            if(min == mis1)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis1";
                                            }
                                            if(min == mis2)
                
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                                qDebug() << Q_FUNC_INFO << "mis2";
                                            }
                                            if(min == mis3)
                                            {
                                                this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                                qDebug() << Q_FUNC_INFO << "mis3";
                
                                            }
                
                                            m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                            poscounter++;
                                            qDebug() << Q_FUNC_INFO << " 4 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                        }
                
                                        break;
                                    default:
                                        this->setPos(anchorPoint);
                                        colourchooser = 0;
                                        qDebug() << Q_FUNC_INFO << " NO FIND ITEM CLOSEST .... ";
                
                                        break;
                                    }
                
                                    //qDebug() << "debugpos ....." << this->pos();
                
                
                
                            }
                                if(poscounter == 0){
                                    this->setPos(anchorPoint);
                                    colourchooser = 0;
                                }
                                else
                                {
                                    //getPos(this->pos());
                                    m_p.setX(this->pos().x());
                                    m_p.setY(this->pos().y());
                                    emit senderRectData(m_p, this->boundingRect(), m_rect);
                                    //qDebug() << "mystupid pos ....." << m_p;
                                }
                
                            }
                            enterpos.setX(0);
                            enterpos.setY(0);
                            colourchooser = 0;
                            m_dragged = false;
                            firstpos = false;
                        }
                        QGraphicsItem::mouseReleaseEvent(event);
                        m_pen.setColor(Qt::green);
                        update();
                
                }
                
                
                gfxxG Offline
                gfxxG Offline
                gfxx
                wrote on last edited by
                #7

                @gfxx second part of code ....

                code_text

                
                void DragItemV_cks::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
                {
                    //painter->;
                   painter->setPen(m_pen);
                   painter->drawImage(DragItemV_cks::ImgPosition, DragItemV_cks::scaleBoximg);
                   painter->drawRect(boundingRect());
                   switch (colourchooser) {
                   case 1:
                       painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                       painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                       painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                       painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                       painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                       painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                       Hleft=true;
                       Hright=false;
                       Dleft=false;
                       Dright=false;
                       break;
                   case 2:
                       painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                       painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                       painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                       painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                       painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                       painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                       Hleft=false;
                       Hright=true;
                       Dleft=false;
                       Dright=false;
                       break;
                   case 3:
                       painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                       painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                       painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                       painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                       painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                       painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                       painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                       Hright=false;
                       Dleft=true;
                       Dright=false;
                       break;
                   case 4:
                       painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                       painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                       painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                       painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                       painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                       painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                       painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                       Hleft=false;
                       Hright=false;
                       Dleft=false;
                       Dright=true;
                       break;
                   default:
                       painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                       painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                       painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                       painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                       painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                       painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                       painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                       Hleft=false;
                       Hright=false;
                       Dleft=false;
                       Dright=false;
                       break;
                   }
                
                       update();
                
                
                }
                

                bkt

                gfxxG 1 Reply Last reply
                0
                • gfxxG gfxx

                  @gfxx second part of code ....

                  code_text

                  
                  void DragItemV_cks::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
                  {
                      //painter->;
                     painter->setPen(m_pen);
                     painter->drawImage(DragItemV_cks::ImgPosition, DragItemV_cks::scaleBoximg);
                     painter->drawRect(boundingRect());
                     switch (colourchooser) {
                     case 1:
                         painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                         painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                         painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                         painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                         painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                         painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                         Hleft=true;
                         Hright=false;
                         Dleft=false;
                         Dright=false;
                         break;
                     case 2:
                         painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                         painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                         painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                         painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                         painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                         painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                         Hleft=false;
                         Hright=true;
                         Dleft=false;
                         Dright=false;
                         break;
                     case 3:
                         painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                         painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                         painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                         painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                         painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                         painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                         painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                         Hright=false;
                         Dleft=true;
                         Dright=false;
                         break;
                     case 4:
                         painter->setBrush(QBrush(Qt::red, Qt::SolidPattern));
                         painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                         painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                         painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                         painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                         painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                         painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                         Hleft=false;
                         Hright=false;
                         Dleft=false;
                         Dright=true;
                         break;
                     default:
                         painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
                         painter->drawRect(boundingRect().topLeft().x(), boundingRect().topLeft().y(), 50,50);
                         painter->drawRect(boundingRect().topRight().x(), boundingRect().topRight().y(), -50,50);
                         painter->drawRect(boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y(), 50,-50);
                         painter->drawRect(boundingRect().bottomRight().x(), boundingRect().bottomRight().y(), -50,-50);
                         painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
                         painter->drawEllipse(DragItemV_cks::scaleBoximg.rect().center().x(), DragItemV_cks::scaleBoximg.rect().center().y(), 15, 15);
                         Hleft=false;
                         Hright=false;
                         Dleft=false;
                         Dright=false;
                         break;
                     }
                  
                         update();
                  
                  
                  }
                  
                  gfxxG Offline
                  gfxxG Offline
                  gfxx
                  wrote on last edited by
                  #8

                  @gfxx heather file

                  #ifndef DRAGITEMV_CSK_H
                  #define DRAGITEMV_CSK_H
                  
                  #include <QGraphicsRectItem>
                  #include <QPen>
                  #include <QLabel>
                  #include <QGraphicsScene>
                  #include <QGraphicsView>
                  #include <QGraphicsItem>
                  #include <QGraphicsRectItem>
                  #include <QGraphicsPolygonItem>
                  #include <QDialog>
                  #include <QWidget>
                  #include <QWidgetAction>
                  #include <QWidgetData>
                  #include <QWidgetItem>
                  #include <QPixmap>
                  #include <QtWidgets/qstyle.h>
                  #include <QGraphicsRectItem>
                  #include <QGraphicsSceneMouseEvent>
                  #include <QPointF>
                  #include <QObject>
                  #include <QGraphicsItem>
                  #include <QDrag>
                  #include <QDragEnterEvent>
                  #include <QDragLeaveEvent>
                  #include <QDragMoveEvent>
                  #include <QDropEvent>
                  #include <QMimeData>
                  #include <QMimeType>
                  #include <QMetaType>
                  
                  
                  
                  
                  QT_BEGIN_NAMESPACE
                  class QGraphicsSceneMouseEvent;
                  QT_END_NAMESPACE
                  
                  
                  class DragItemV_cks : public QObject, public QGraphicsItem
                  {
                     Q_OBJECT
                     Q_INTERFACES(QGraphicsItem)
                  
                  public:
                      //DragItemV_cks();
                      DragItemV_cks(QGraphicsItem* parent = 0);
                      //~DragItemV_cks();
                      static QImage Boximg;
                      static QImage scaleBoximg;
                      static QImage realBoximg;
                      static QPoint ImgPosition;
                      bool selectRectItem;
                      void setAnchorPoint(const QPointF& anchorPoint);
                      void setImageDim(QImage realImage, int dXImage, int dYImage);
                      void setImagePos(int Xspace, int Yspace);
                      void getPoint(QPointF myPointBox);
                      //QPointF lastBox();
                      static QPointF movepos;
                      static QPointF enterpos;
                      static bool firstpos;
                      QRectF boundingRect() const { return rect; }
                      QPointF lastPoint() { return m_p;}
                      void setRect(QRectF r) {rect.setRect(r.topLeft().x(), r.topLeft().y(), r.width(), r.height());}
                      void getPos(QPointF pf){ m_p.setX(pf.x()); m_p.setY(pf.y());}
                      void initializeForm();
                      void setNewrect(QRectF hkr);
                      void setHNewrect(QRectF hNkr);
                      //void setVbool(bool Vbool);
                  
                  
                  public slots:
                      //QPointF lastBoxV() const { return m_lastBoxV; }
                      void setVbool(bool Vbool);
                  
                  
                  protected:
                      void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
                      void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
                      void mousePressEvent(QGraphicsSceneMouseEvent *event);
                      void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
                      void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
                  
                  
                      //virtual QVariant itemChange ( GraphicsItemChange change, const QVariant & value );
                  
                  protected slots:
                      void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
                  
                  private:
                      QPen m_pen;
                      QPointF anchorPoint;
                      bool m_dragged;
                      int dimXImage;
                      int dimYImage;
                      QPointF m_p;
                      QRectF rect;
                      QRectF m_rect;
                      QRectF TL_rect;
                      QRectF TR_rect;
                      QRectF BL_rect;
                      QRectF BR_rect;
                      QRectF m_Newrect;
                      QRectF mh_Newrect;
                  
                      //SignalRectfPass m_P;
                  
                  
                  
                  signals:
                      void senderRectData(QPointF, QRectF, QRectF);
                     // void clicked(bool);
                  
                     // Q_DECLARE_METATYPE(DragItemV_cks);
                  
                  };
                  
                  
                  
                  #endif // DRAGITEMV_CSK_H
                  

                  bkt

                  gfxxG 1 Reply Last reply
                  0
                  • gfxxG gfxx

                    @gfxx heather file

                    #ifndef DRAGITEMV_CSK_H
                    #define DRAGITEMV_CSK_H
                    
                    #include <QGraphicsRectItem>
                    #include <QPen>
                    #include <QLabel>
                    #include <QGraphicsScene>
                    #include <QGraphicsView>
                    #include <QGraphicsItem>
                    #include <QGraphicsRectItem>
                    #include <QGraphicsPolygonItem>
                    #include <QDialog>
                    #include <QWidget>
                    #include <QWidgetAction>
                    #include <QWidgetData>
                    #include <QWidgetItem>
                    #include <QPixmap>
                    #include <QtWidgets/qstyle.h>
                    #include <QGraphicsRectItem>
                    #include <QGraphicsSceneMouseEvent>
                    #include <QPointF>
                    #include <QObject>
                    #include <QGraphicsItem>
                    #include <QDrag>
                    #include <QDragEnterEvent>
                    #include <QDragLeaveEvent>
                    #include <QDragMoveEvent>
                    #include <QDropEvent>
                    #include <QMimeData>
                    #include <QMimeType>
                    #include <QMetaType>
                    
                    
                    
                    
                    QT_BEGIN_NAMESPACE
                    class QGraphicsSceneMouseEvent;
                    QT_END_NAMESPACE
                    
                    
                    class DragItemV_cks : public QObject, public QGraphicsItem
                    {
                       Q_OBJECT
                       Q_INTERFACES(QGraphicsItem)
                    
                    public:
                        //DragItemV_cks();
                        DragItemV_cks(QGraphicsItem* parent = 0);
                        //~DragItemV_cks();
                        static QImage Boximg;
                        static QImage scaleBoximg;
                        static QImage realBoximg;
                        static QPoint ImgPosition;
                        bool selectRectItem;
                        void setAnchorPoint(const QPointF& anchorPoint);
                        void setImageDim(QImage realImage, int dXImage, int dYImage);
                        void setImagePos(int Xspace, int Yspace);
                        void getPoint(QPointF myPointBox);
                        //QPointF lastBox();
                        static QPointF movepos;
                        static QPointF enterpos;
                        static bool firstpos;
                        QRectF boundingRect() const { return rect; }
                        QPointF lastPoint() { return m_p;}
                        void setRect(QRectF r) {rect.setRect(r.topLeft().x(), r.topLeft().y(), r.width(), r.height());}
                        void getPos(QPointF pf){ m_p.setX(pf.x()); m_p.setY(pf.y());}
                        void initializeForm();
                        void setNewrect(QRectF hkr);
                        void setHNewrect(QRectF hNkr);
                        //void setVbool(bool Vbool);
                    
                    
                    public slots:
                        //QPointF lastBoxV() const { return m_lastBoxV; }
                        void setVbool(bool Vbool);
                    
                    
                    protected:
                        void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
                        void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
                        void mousePressEvent(QGraphicsSceneMouseEvent *event);
                        void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
                        void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
                    
                    
                        //virtual QVariant itemChange ( GraphicsItemChange change, const QVariant & value );
                    
                    protected slots:
                        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
                    
                    private:
                        QPen m_pen;
                        QPointF anchorPoint;
                        bool m_dragged;
                        int dimXImage;
                        int dimYImage;
                        QPointF m_p;
                        QRectF rect;
                        QRectF m_rect;
                        QRectF TL_rect;
                        QRectF TR_rect;
                        QRectF BL_rect;
                        QRectF BR_rect;
                        QRectF m_Newrect;
                        QRectF mh_Newrect;
                    
                        //SignalRectfPass m_P;
                    
                    
                    
                    signals:
                        void senderRectData(QPointF, QRectF, QRectF);
                       // void clicked(bool);
                    
                       // Q_DECLARE_METATYPE(DragItemV_cks);
                    
                    };
                    
                    
                    
                    #endif // DRAGITEMV_CSK_H
                    
                    gfxxG Offline
                    gfxxG Offline
                    gfxx
                    wrote on last edited by
                    #9

                    @gfxx linux 20 ---qt5.12/qt5.15

                    bkt

                    1 Reply Last reply
                    0
                    • gfxxG gfxx

                      not find error on debugger --- only sigh-fault because memory corruption. So seems some vector not cleared or clear in wrong moment.... I work on it 3/4 hour day from 3 days whitout find my error .... attach dragItemV ( that is equal to dragItemH .... only rectangle 90° one respet firstone .. but same func) ....

                      DragItemV_cks.cpp

                      #include "DragItemV_cks.h"
                      
                      #include <QPainter>
                      #include <QPointF>
                      #include <QDebug>
                      #include <QTime>
                      #include <QTimer>
                      #include "rettangolo.h"
                      
                      int positiochooser = 0;
                      int colourchooser = 0;
                      
                      bool Hleft=false, Hright=false, Dleft=false, Dright=false, VVerticalBox=false, VHorizinBox=false;
                      
                      
                      DragItemV_cks::DragItemV_cks(QGraphicsItem *parent )
                          :QGraphicsItem(parent), m_dragged(false)
                      //QGraphicsRectItem(parent), QObject(parent), m_dragged(false)
                      {
                          setFlags( QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsGeometryChanges);
                          setAcceptHoverEvents(true);
                          selectRectItem = false;
                          setCursor(Qt::OpenHandCursor);
                      
                          m_pen.setColor(Qt::darkCyan);
                          m_pen.setWidth(3);
                          colourchooser = 0;
                      
                      
                      }
                      
                      
                      QImage DragItemV_cks::Boximg("/home/bleach/project/res/icons/box-qt.png");
                      QImage DragItemV_cks::scaleBoximg("/home/bleach/project/res/icons/box-qt.png");
                      QPoint DragItemV_cks::ImgPosition(0,0);
                      QPointF DragItemV_cks::movepos(0,0);
                      QPointF DragItemV_cks::enterpos(0,0);
                      bool DragItemV_cks::firstpos = false;
                      
                      
                      void DragItemV_cks::setImageDim(QImage realImage, int dXImage, int dYImage)
                      {
                          DragItemV_cks::scaleBoximg = realImage.scaled(dXImage, dYImage , Qt::IgnoreAspectRatio);
                      }
                      
                      void DragItemV_cks::initializeForm()
                      {
                          m_pen.setColor(Qt::darkCyan);
                          m_pen.setWidth(3);
                          colourchooser = 0;
                      }
                      
                      void DragItemV_cks::setNewrect(QRectF hkr)
                      {
                          m_Newrect.setRect(0,0, hkr.width(), hkr.height());
                      }
                      
                      void DragItemV_cks::setHNewrect(QRectF hNkr)
                      {
                          mh_Newrect.setRect(0,0, hNkr.width(), hNkr.height());
                      }
                      
                      
                      void DragItemV_cks::setVbool(bool Vbool){
                          if(Vbool){
                              VVerticalBox=true;
                              VHorizinBox=false;
                              qDebug() << "Vbool=TRUE    VVerticalBox=   " << VVerticalBox << "  ||  VHorizinBox=  " << VHorizinBox;
                          }
                          else{
                              VVerticalBox=false;
                              VHorizinBox=true;
                              qDebug() << "Vbool=FALSE    VVerticalBox=   " << VVerticalBox << "  ||  VHorizinBox=  " << VHorizinBox;
                          }
                      }
                      
                      
                      
                      void DragItemV_cks::setImagePos(int Xspace, int Yspace)
                      {
                          DragItemV_cks::ImgPosition.setX(Xspace);
                          DragItemV_cks::ImgPosition.setY(Yspace);
                      }
                      
                      void DragItemV_cks::setAnchorPoint(const QPointF &anchorPoint)
                      {
                          this->anchorPoint = anchorPoint;
                      }
                      
                      
                      void DragItemV_cks::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
                      {
                          m_pen.setColor(Qt::red);
                          update();
                      }
                      
                      void DragItemV_cks::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
                      {
                          if(m_pen.color() == Qt::red)
                          {
                              m_pen.setColor(Qt::darkCyan);
                              update();
                          }
                      }
                      
                      void DragItemV_cks::mousePressEvent(QGraphicsSceneMouseEvent *event)
                      {
                          enterpos.setX(event->pos().x());
                          enterpos.setY(event->pos().y());
                      
                      
                          QVector<double> list2;
                      
                          QLineF linemtl = QLineF(boundingRect().topLeft(), enterpos);
                          QLineF linemtr = QLineF(boundingRect().topRight(), enterpos);
                          QLineF linembl = QLineF(boundingRect().bottomLeft(), enterpos);
                          QLineF linembr = QLineF(boundingRect().bottomRight(), enterpos);
                      
                          list2.append(double(linemtl.length()));
                          list2.append(double(linemtr.length()));
                          list2.append(double(linembl.length()));
                          list2.append(double(linembr.length()));
                          double minM = *std::min_element(list2.constBegin(), list2.constEnd());
                          if(minM == double(linemtl.length())){colourchooser = 1;}
                          else if(minM == double(linemtr.length())){colourchooser = 2;}
                          else if(minM == double(linembl.length())){colourchooser = 3;}
                          else if(minM == double(linembr.length())){colourchooser = 4;}
                          else if((enterpos.x() == 0) && (enterpos.y()==0)){positiochooser = 0; colourchooser = 0;}
                          list2.clear();
                      
                          qDebug() << "scelta ancora -m- VERTICAL = " << colourchooser;
                      
                          if(selectRectItem)
                          {
                              selectRectItem = false;
                          }
                          else
                          {
                              selectRectItem = true;
                          }
                          m_pen.setColor(Qt::red);
                          update();
                      
                      }
                      
                      
                      void DragItemV_cks::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
                      {
                          m_dragged = true;
                          movepos.setX(event->scenePos().x());
                          movepos.setY(event->scenePos().y());
                          m_pen.setColor(Qt::red);
                          update();
                          QGraphicsItem::mouseMoveEvent(event);
                      
                      }
                      
                      /*QVariant DragItemV_cks::itemChange ( GraphicsItemChange change, const QVariant & value )
                      {
                          if (change == ItemPositionChange && scene()) {
                              // value is the new position.
                              QPointF newPos = value.toPointF();
                              QRectF rect = scene()->sceneRect();
                              if (!rect.contains(newPos)) {
                                  // Keep the item inside the scene rect.
                                  newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
                                  newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
                                  //newPos.setX(rect.topLeft().x());
                                  //newPos.setY(rect.topLeft().y());
                                  return newPos;
                              }
                          }
                          return QGraphicsItem::itemChange(change, value);
                      }*/
                      
                      void DragItemV_cks::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
                      {
                          QPointF thisBox(0,0);
                          positiochooser = 0;
                          int poscounter = 0;
                              qreal min = 0;
                              qreal mis1 = 0;
                              qreal mis2 = 0;
                              qreal mis3 = 0;
                              qreal mis4 = 0;
                              QPointF p;
                              p.setX(event->scenePos().x());
                              p.setY(event->scenePos().y());
                      
                      
                      
                      
                              if(m_dragged){
                                  QList<QGraphicsItem*> colItems = collidingItems();
                                  if(colItems.isEmpty())
                                      this->setPos(anchorPoint);
                                  else {
                                      QGraphicsItem* closestItem = colItems.at(0);
                                      qreal shortestDist = 1000000;
                                      foreach(QGraphicsItem* item, colItems){
                      
                                          switch (colourchooser) {
                                          case 1:
                                              //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                              if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ //&& (item->zValue() > 90) && (item->zValue() < 93)){ //
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                      
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                      
                                                  if(min == mis4)
                                                  {
                                                      this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                      qDebug() << Q_FUNC_INFO << "mis4";
                                                  }
                                                  if(min == mis2)
                                                  {
                                                      this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y()));
                                                      qDebug() << Q_FUNC_INFO << "mis2";
                                                  }
                                                  if(min == mis3)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                      qDebug() << Q_FUNC_INFO << "mis3";
                                                  }
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 1 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                      
                                              }
                                              else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                      
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                      
                                                  if(min == mis4)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y() + m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis4";
                                                  }
                                                  if(min == mis2)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y()));
                                                      qDebug() << Q_FUNC_INFO << "mis2";
                                                  }
                                                  if(min == mis3)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis3";
                                                  }
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 1 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                      
                      
                                              }
                      
                                              break;
                                          case 2:
                                              //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                              if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                      
                                                  if(min == mis1)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                                      qDebug() << Q_FUNC_INFO << "mis1";
                                                  }
                                                  if(min == mis4)
                                                  {
                                                      this->setPos(QPointF((closestItem->scenePos().x() - (m_Newrect.width() - closestItem->sceneBoundingRect().width())), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                      qDebug() << Q_FUNC_INFO << "mis4";
                                                  }
                                                  if(min == mis3)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() + closestItem->sceneBoundingRect().height()));
                                                      qDebug() << Q_FUNC_INFO << "mis3";
                                                  }
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 2 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                              }
                                              else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                      
                                                  if(min == mis1)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                                      qDebug() << Q_FUNC_INFO << "mis1";
                                                  }
                                                  if(min == mis4)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() + m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis4";
                                                  }
                                                  if(min == mis3)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() + m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis3";
                                                  }
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 2 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                              }
                                              //qDebug() << "CASE2: we find case1 item Z value:  " << item->zValue() << "   min equal to ...." << min << ".." << mis1 << ".." << mis2 << ".." << mis3;
                      
                                              break;
                                          case 3:
                                              //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                              if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                      
                                                  if(min == mis2)
                                                  {
                                                      this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis2"; /* (ui->HBox_2->isOn) */
                                                  }
                                                  if(min == mis1)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis1";
                                                  }
                                                  if(min == mis4)
                                                  {
                                                      this->setPos(QPointF((closestItem->scenePos().x() + closestItem->sceneBoundingRect().width()), closestItem->scenePos().y() - (m_Newrect.height() - closestItem->sceneBoundingRect().height())));
                                                      qDebug() << Q_FUNC_INFO << "mis4";
                                                  }
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 3 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                              }
                                              else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ //  && (item->zValue() > 89) && (item->zValue() < 91)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                      
                                                  if(min == mis2)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis2";
                                                  }
                                                  if(min == mis1)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis1";
                                                  }
                                                  if(min == mis4)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() + m_Newrect.width(), closestItem->scenePos().y()));
                                                      qDebug() << Q_FUNC_INFO << "mis4";
                                                  }
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 3 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                              }
                                              //qDebug() << "CASE3: we find case1 item Z value:  " << item->zValue() << "   min equal to ...." << min << ".." << mis1 << ".." << mis2 << ".." << mis3;
                      
                                              break;
                                          case 4:
                                              //if(colItems.at(0)->zValue() < 90){ qDebug() << "colItems.at(0)->zValue() ..." << colItems.at(0)->zValue() << ".. item zValue .." << item->zValue();}
                                              if(item->sceneBoundingRect().contains(p) && VVerticalBox && !VHorizinBox ){ // && (item->zValue() > 90) && (item->zValue() < 93)){ //){ // && (item->zValue() > 80) && (item->zValue() < 89)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                                                  if(min == mis1)
                                                  {
                                                      //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()));
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis1";
                                                  }
                                                  if(min == mis2)
                      
                                                  {
                                                      //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()));
                                                      this->setPos(QPointF((closestItem->scenePos().x() - (m_Newrect.width() - closestItem->sceneBoundingRect().width())), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis2";
                                                  }
                                                  if(min == mis3)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - (m_Newrect.height() - closestItem->sceneBoundingRect().height())));
                                                      //this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y()- this->boundingRect().height()));
                                                      qDebug() << Q_FUNC_INFO << "mis3";
                      
                                                  }
                      
                                                  //m_p.setX(this->pos().x());
                                                  //m_p.setY(this->pos().y());
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 4 CASE  VERT - if : we find IF item Z value:  " << item->zValue();
                                              }
                                              else if(item->sceneBoundingRect().contains(p) && !VVerticalBox && VHorizinBox ){ // && (item->zValue() > 80) && (item->zValue() < 89)){ //){ // && (item->zValue() > 89) && (item->zValue() < 91)){
                                                  mis1 = QLineF(item->sceneBoundingRect().topLeft(),  p).length();
                                                  mis2 = QLineF(item->sceneBoundingRect().topRight(),  p).length();
                                                  mis3 = QLineF(item->sceneBoundingRect().bottomLeft(),  p).length();
                                                  mis4 = QLineF(item->sceneBoundingRect().bottomRight(),  p).length();
                                                  if((mis1 < mis2) && (mis1 < mis3) && (mis1 < mis4)){min = mis1;}
                                                  else if((mis2 < mis3) && (mis2 < mis1) && (mis2 < mis4)){min = mis2;}
                                                  else if((mis3 < mis2) && (mis3 < mis1) && (mis3 < mis4)){min = mis3;}
                                                  else{min = mis4;}
                                                  if(min < shortestDist){
                                                      shortestDist = min;
                                                      closestItem = item;
                                                  }
                                                  if(min == mis1)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis1";
                                                  }
                                                  if(min == mis2)
                      
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x(), closestItem->scenePos().y() - m_Newrect.height()));
                                                      qDebug() << Q_FUNC_INFO << "mis2";
                                                  }
                                                  if(min == mis3)
                                                  {
                                                      this->setPos(QPointF(closestItem->scenePos().x() - m_Newrect.width(), closestItem->scenePos().y()));
                                                      qDebug() << Q_FUNC_INFO << "mis3";
                      
                                                  }
                      
                                                  m_rect.setRect(closestItem->sceneBoundingRect().topLeft().x(), closestItem->sceneBoundingRect().topLeft().y(), closestItem->sceneBoundingRect().width(), closestItem->sceneBoundingRect().height());
                                                  poscounter++;
                                                  qDebug() << Q_FUNC_INFO << " 4 CASE  VERT - else : we find ELSE item Z value:  " << item->zValue();
                                              }
                      
                                              break;
                                          default:
                                              this->setPos(anchorPoint);
                                              colourchooser = 0;
                                              qDebug() << Q_FUNC_INFO << " NO FIND ITEM CLOSEST .... ";
                      
                                              break;
                                          }
                      
                                          //qDebug() << "debugpos ....." << this->pos();
                      
                      
                      
                                  }
                                      if(poscounter == 0){
                                          this->setPos(anchorPoint);
                                          colourchooser = 0;
                                      }
                                      else
                                      {
                                          //getPos(this->pos());
                                          m_p.setX(this->pos().x());
                                          m_p.setY(this->pos().y());
                                          emit senderRectData(m_p, this->boundingRect(), m_rect);
                                          //qDebug() << "mystupid pos ....." << m_p;
                                      }
                      
                                  }
                                  enterpos.setX(0);
                                  enterpos.setY(0);
                                  colourchooser = 0;
                                  m_dragged = false;
                                  firstpos = false;
                              }
                              QGraphicsItem::mouseReleaseEvent(event);
                              m_pen.setColor(Qt::green);
                              update();
                      
                      }
                      
                      
                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      @gfxx said in QGraphicItems c++ setAncorPoint crash!:

                      not find error on debugger --- only sigh-fault because memory corruption

                      In that case (assuming you're running your app through debugger) you for sure should have the stack trace after crash, please post it.

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      1

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved