QGraphicsView updates not correct



  • hello,
    I subclass a QGraphicsItem in order to draw a line more faster than QGraphicsPath Item.
    My new item worked fine. But if I add a QGraphicsItem into scene before adding my customize Item,
    QGraphicsView only update part of my Item. It looks very strange. Can anyone tell me the reason?

    Here is my customized item.
    /***********************************************************************************/
    class GraphicsFreeLine : public QGraphicsItem
    {
    public:
    GraphicsFreeLine();
    QRectF boundingRect() const;
    QPainterPath shape() const;
    QPainterPath* CurrentPath() { return m_pPath;}
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget widget);
    private:
    QPainterPath
    m_pPath;
    QRectF m_Rect;
    };

    GraphicsFreeLine::GraphicsFreeLine()
    {
    setFlags(ItemIsSelectable | ItemIsMovable);
    setAcceptsHoverEvents(true);
    m_pPath = new QPainterPath();
    setCacheMode(QGraphicsItem::NoCache);
    }

    QRectF GraphicsFreeLine::boundingRect() const
    {
    QRectF rect = m_pPath->boundingRect();
    rect.adjust(-LineWidth,-LineWidth,2* LineWidth,2*LineWidth);
    return rect;
    }

    QPainterPath GraphicsFreeLine::shape() const
    {
    return *m_pPath;
    }

    void GraphicsFreeLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
    Q_UNUSED(widget);
    painter->setClipRect(option->exposedRect);
    QPen pen(Qt::red,LineWidth,Qt::SolidLine,Qt::RoundCap,Qt::BevelJoin);
    painter->strokePath(*m_pPath,pen);
    }

    Also, I subclassed QGraphicsView to treat mouse event.
    So I can draw a bezier path.

    /***********************************************************************************/
    class GraphicsViewEx : public QGraphicsView
    {
    Q_OBJECT
    public:
    GraphicsViewEx();
    protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent event);
    private:
    QPointF m_curPt,m_prevPt;
    GraphicsFreeLine
    pFLine;
    };

    QPointF midPoint(QPointF p1,QPointF p2)
    {
    QPointF p = QPointF((p2.x()-p1.x())/2.0,(p2.y()-p1.y())/2.0);
    return QPointF(p1.x() + p.x(),p1.y()+ p.y());
    }

    GraphicsViewEx::GraphicsViewEx() : QGraphicsView()
    {

    }

    void GraphicsViewEx::mousePressEvent(QMouseEvent *event)
    {
    QPointF p = this->mapToScene(event->pos());
    m_curPt = m_prevPt = p;
    pFLine = new GraphicsFreeLine();
    this->scene()->addItem(pFLine);
    }

    void GraphicsViewEx::mouseMoveEvent(QMouseEvent *event)
    {
    if (event->modifiers() & Qt::ShiftModifier) {
    return;
    }else{
    if(event->buttons() == Qt::LeftButton){
    QPointF p = this->mapToScene(event->pos());
    QPointF cp = midPoint(m_curPt,p);

           // create new path
            QPainterPath newPath(m_prevPt);
            newPath.quadTo(m_curPt,cp);
           
            pFLine->CurrentPath()->addPath(newPath);
            
            QRectF rect = newPath.boundingRect();
            rect.adjust(-pFLine->LineWidth,-pFLine->LineWidth,2*pFLine->LineWidth,2*pFLine->LineWidth);
          // only update part of  the path to make draw faster
            pFLine->update(rect);
            m_prevPt = cp;
            m_curPt = p;
        }
    }
    QGraphicsView::mouseMoveEvent(event);
    

    }

    void GraphicsViewEx::mouseReleaseEvent(QMouseEvent *event)
    {
    }

    Other code:

    /***********************************************************************************/
    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    QGraphicsScene scene(0,0,1024,768);
    GraphicsViewEx view;
    view.setScene(&scene);
    view.setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
    view.show();

    #if 1 // if I add these code , line can not be updated correctly !!
    QGraphicsPathItem* pItem = new QGraphicsPathItem();
    QPainterPath p;
    p.moveTo(900,100);
    p.quadTo(QPointF(200,200),QPointF(200,300));
    pItem->setPath(p);
    scene.addItem(pItem);
    pItem->setZValue(128);
    #endif

    return app.exec();
    

    }

    These code works fine for me . Line can be drawn smoothly.
    The problem is ,When I add some item in main, My new Lines can not be drawn correctly.
    QGraphicsView's update works very strange . Please help.

    Thanks.
    Johnwang


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    Please enclose your code with coding tags (one @ at the beginning and one at the end) Otherwise the code is very difficult to read and will get less attention


Log in to reply