簡體   English   中英

重寫QGraphicsItem的paint()和mouseEvents()

[英]overriding paint() and mouseEvents() of a QGraphicsItem

在Qt中,當我單擊某個項目時,我試圖使其突出顯示,然后從其末端到當前光標位置繪制一條線。 我可以突出顯示它或畫一條線,但不能兩者都畫。 這是我的課程:

// ucPin.h 
#pragma once
#include "stdafx.h"

class ucPin : public QGraphicsLineItem{
    qreal x1, y1, x2, y2;
    bool isClicked;
    QGraphicsLineItem * li;
public : 

    ucPin (qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem *parent = 0);

    void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget );
    void mousePressEvent    (QGraphicsSceneMouseEvent * event);
    void mouseReleaseEvent  (QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent     (QGraphicsSceneMouseEvent *event);

};

// ucPin.cpp
    #include "ucPin.h"

ucPin::ucPin (qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem *parent) : 
        QGraphicsLineItem(x1, y1, x2, y2, parent){
        this->x1 = x1; this->y1 = y1; this->x2 = x2; this->y2 = y2;
        this->setFlags(QGraphicsItem::ItemIsFocusable
                | QGraphicsItem::ItemIsSelectable);

        isClicked = false;
        li = NULL;
    }

void ucPin::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget )
{  

    QStyleOptionGraphicsItem newOption  (*option);
    newOption.state =QStyle::State_None;
    QGraphicsLineItem::paint(painter, &newOption, widget);

    //painter-> setRenderHint(QPainter::Antialiasing);


    if (option->state & QStyle::State_Selected) {
        QPen outline;
        outline.setColor(Qt::green);
        outline.setWidth(6);
        setPen(outline);
    }
    else{
        QPen outline; outline.setWidth(3);
        setPen(outline);
    }
}

void ucPin::mousePressEvent(QGraphicsSceneMouseEvent* event) {
    /*QPointF pos = event->pos();

    QGraphicsLineItem * li = new QGraphicsLineItem(0,0, pos.x(), pos.y(), this);*/
    isClicked = true;
}

void ucPin::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) {
    isClicked = false;
}

void ucPin::mouseMoveEvent(QGraphicsSceneMouseEvent* event) {
    if(NULL != li)  { delete li; li = NULL;}

    li = new QGraphicsLineItem(0,0, event->pos().x(), event->pos().y(), this);

}

我猜想在實現mouseEvent覆蓋時,不會調用所選狀態的繪畫事件? 如何解決這個問題?

為了請求重繪QGraphicsItem ,只要外觀發生變化,就需要調用update() setSelected在QGraphicsItem :: mousePressEvent中調用,因此您需要將其傳播到覆蓋的mousePressEvent調用QGraphicsLineItem::mousePressEvent(event)的基類中。 mouseReleaseEvent 或者,您可以自己處理選擇狀態,但是除非有充分的理由,否則您不應該這樣做。 另外,我認為在調用QGraphicsLineItem::paint(...)之前設置筆可能很有意義。

同樣,每次鼠標移動時分配一個新的li效率很低-只分配一次並使用setLine設置新的坐標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM