在QGraphicsView上的第一个和最后一个QPoint之间画一条线

时间:2014-09-26 14:31:12

标签: c++ qt qpixmap

我有一个类,允许用户通过单击图像上的任意位置在图像上绘制连续线,以创建自动相互连接的点。

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));没有在我的图片上绘制任何内容。

1 个答案:

答案 0 :(得分:0)

正如你所说:

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

相信我,这是你问题的根源。 QThread::sleep(1);会睡觉,但这并不意味着您的更改(您的addLine)会显示在屏幕上,不是!

这段代码,你从我的一个答案中知道它现在不添加行,它等待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);

来自你的代码。