QGraphicItems c++ setAncorPoint crash!
-
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
-
Hi,
Did you check that all your pointers point to valid objects ?
-
@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
-
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. -
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(); } -
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(); }@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(); } -
@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(); }@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 -
@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 -
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(); }@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.