У меня есть класс, который позволяет пользователю нарисовать непрерывную линию на изображении, щелкнув в любом месте изображения, чтобы создать точки, которые автоматически соединяются друг с другом.Рисование линии между первым и последним 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));
ничего на мой образ не рисовать.
'addLine (QLine (pol.first(), pol.last()), QPen (Qt :: red, 1));' должен работать, код нормальный, но когда вы вызываете 'this-> clear (); 'затем вы удаляете все элементы в сцене. – Chernobyl
да, я знаю это -> clear(); очищает сцену. У меня был QThread :: sleep (1); после строки addLine(), но это не отображало строку. Я хочу, чтобы пользователь увидел, что их линия соединяется, запустите код, чтобы передать вектор, а затем очистите сцену. – testus