2014-09-26 6 views
0

У меня есть класс, который позволяет пользователю нарисовать непрерывную линию на изображении, щелкнув в любом месте изображения, чтобы создать точки, которые автоматически соединяются друг с другом.Рисование линии между первым и последним QPoint на QGraphicsView

GraphicsScene::GraphicsScene(QObject *parent) : 
    QGraphicsScene(parent){ 

    //... 
    qimOriginal = QImage((uchar*)src.data, src.cols, src.rows, src.step, QImage::Format_RGB888); 
    addPixmap(QPixmap::fromImage(qimOriginal)); 
} 

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent){ 
    if (mouseEvent->button() == Qt::LeftButton){ 

     QPoint pos = mouseEvent->scenePos().toPoint(); 
     pol.append(pos); 
     if(pol.size() > 1){ 
      QPainterPath myPath; 
      myPath.addPolygon(pol); 
      addPath(myPath,QPen(Qt::red,1)); 
     } 
    } 
} 

В моем диалоговом окне, которое использует GraphicsScene У меня есть кнопка, которая по щелчку возвращает вектор из GraphicsScene с координатами точек. Прежде чем он вернет вектор, я хочу нарисовать линию между первой и последней точкой QPolygon, чтобы создать область. Ниже моя GraphicsScene::getCoordinates() функция:

std::vector<Point2f> GraphicsScene::getCoordinates(){ 
    qDebug() << pol.first() << pol.last(); 
    addLine(QLine(pol.first(),pol.last()),QPen(Qt::red,1)); 

    std::vector<Point2f> vecPoint; 
    if (pol.size()>2){ 
     std::vector<QPoint> myVec = pol.toStdVector(); 

     for(int i=0; i<myVec.size(); i++) { 
      QPoint point = myVec[i]; 
      Point2f p(point.x(), point.y()); 
      vecPoint.push_back(p); 
     } 

     pol.clear(); 
     this->clear(); 
     return vecPoint; 
    } 
    else{ 
     cout << "empty vector" << endl; 
     return vecPoint; 
    } 

} 

Моя проблема заключается в том, что по какой-то причине addLine(QLine(pol.first(),pol.last()),QPen(Qt::red,1)); ничего на мой образ не рисовать.

+0

'addLine (QLine (pol.first(), pol.last()), QPen (Qt :: red, 1));' должен работать, код нормальный, но когда вы вызываете 'this-> clear (); 'затем вы удаляете все элементы в сцене. – Chernobyl

+0

да, я знаю это -> clear(); очищает сцену. У меня был QThread :: sleep (1); после строки addLine(), но это не отображало строку. Я хочу, чтобы пользователь увидел, что их линия соединяется, запустите код, чтобы передать вектор, а затем очистите сцену. – testus

ответ

0

Как вы сказали:

I did have QThread::sleep(1); after the addLine() 

И поверьте, это источник вашей проблемы. QThread::sleep(1); спит, но это не значит, что ваши изменения (ваша добавленная линия) отображаются на экране, нет!

И этот код, вы знаете, из одного из моих ответов не добавляется линия в данный момент, он ждет 1 секунду, после чего вы можете увидеть эту строку. Это проблема нити.

if(pol.size() > 1){ 
    QPainterPath myPath; 
    myPath.addPolygon(pol); 
    addPath(myPath,QPen(Qt::red,1)); 

    qDebug() << pol.first() << pol.last(); 
    addLine(QLine(pol.first(),pol.last()),QPen(Qt::red,1)); 
    Sleep(1000);//Sleep from WinApi 
} 

Это источник вашей проблемы, но как это решить? Это еще один вопрос, но я могу предложить вам попробовать использовать

QTimer::singleShot(1000,this,SLOT(echo())); 

В слоте вы должны очистить сцену и, конечно, вы должны удалить

QThread::sleep(1); 

из вашего кода.

 Смежные вопросы

  • Нет связанных вопросов^_^