问题:继承QGraphicsItem不能检测到鼠标事件原因:有可能是边界方法重写的不对[pure virtual] QRectF QGraphicsItem::boundingRect() const解决:在子类中重写QRectF boundingRect()方法
def createAnimationOnDebug(self, eventName, rate):
self.prepareGeometryChange()
if self.anim:
self.anim.stop()
self.anim = None
self.anim = self.createAnimation(eventName,0.25/rate)
self.anim.start()
最近在
Qt
的学习中遇到了一个问题,就是重写了mouseMoveEvent,在其中打印
鼠标
移动的坐标信息却无效
在
Qt
中要捕捉
鼠标
移动信息需要重写mouseMoveEvent,但是mouseMoveEvent为了不太消耗资源在默认情况下是需要按下
鼠标
移动才能捕捉到,想要在
鼠标
没有按下的情况下也能捕捉
鼠标
,需要对窗口设置setMouseTracking(true).
此属性保存是否为小部件启用了...
QGraphicsItem
s收不到消息分有好几种情况。除了错误的代码外,还有一些对
Qt
原理理解上的问题(
Qt
埋下的坑)。
情况 (1)如果是mouseMoveEvent收不到消息,而mousePressEvent能收到消息,则往往在mousePressEvent中
不能
把消息传递给父类。例如
void QGraphicsEllipseSubItem::mousePressEvent(QGraphicsSceneMouseEvent *event){
qDebug() << "elli
三个碰撞
检测
函数
该图形项是否与指定的图形项碰撞
bool
QGraphicsItem
::collidesWithItem(const
QGraphicsItem
*other,
Qt
::ItemSelectionMode mode =
Qt
::IntersectsItemShape) const
该图形项是否与指定的路径碰撞
bool
QGraphicsItem
::collidesWithPath(const QPainterPath &path,
Qt
::ItemSelectionMode m
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
if (event->type() == QEvent::MouseButtonRelease && obj == ui->treeWidget)
qDebug() << "sdsd";
return QWidget::eventFilter(obj, event
MyGraphicsItem(
QGraphicsItem
*parent = nullptr) :
QGraphicsItem
(parent) {}
QRectF boundingRect() const override
return QRectF(0, 0, 100, 100);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
if (option->state & QStyle::State_Selected)
painter->setPen(
Qt
::red);
painter->setBrush(
Qt
::red);
painter->setPen(
Qt
::black);
painter->setBrush(
Qt
::white);
painter->drawRect(boundingRect());
class MyGraphicsView : public QGraphicsView
public:
MyGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
setScene(new QGraphicsScene(this));
MyGraphicsItem *item = new MyGraphicsItem;
scene()->addItem(item);
protected:
void mousePressEvent(QMouseEvent *event) override
QGraphicsView::mousePressEvent(event);
QGraphicsItem
*item = scene()->itemAt(mapToScene(event->pos()), transform());
if (item)
item->setSelected(true);
这里重写了MyGraphicsItem的paint()函数,在选中时将颜色设置为红色,未选中时设置为白色。在MyGraphicsView中重写了mousePressEvent()函数,当
鼠标
点击时获取当前位置的item并设置为选中状态。