![](/img/trans.png)
[英]skipping the mouseEvents of the qgraphicsitem in a qgraphics scene
[英]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.