Lizard_Paszczyk
Lizard_Paszczyk

Reputation: 159

QGraphicsSceneMouseEvent is not called

When I click on my scene - nothing happens. I tried many various methods with QMouseEvent and QGraphicsSceneMouseEvent, tried to set focus on my object and then try to click on it - with no result. I was also looking for solution on the Internet on posts from other people, but didn't found anything that would work for me. Where I make mistakes?

Here is some code below:

This is one of my windows, where I create scene, view and object - that I want make respond on my mouse events:

TrackWindow::TrackWindow(Timers *timer)
{
timeLineBar = new QGraphicsScene(this);
timeLineBarView = new QGraphicsView(timeLineBar);
timeLineBarView->setFixedHeight(20);
timeLineBarView->setAlignment(Qt::AlignTop|Qt::AlignLeft);
timeLineBarView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
timeLineBarView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
timeLineBarView->setStyleSheet("background-color: #333333; border:none;");

QVBoxLayout *timeLineLayout = new QVBoxLayout;
timeLineLayout->addWidget(timeLineBarView);
timeLineLayout->addWidget(tracksTimelineView);
timeline = new TimeLine(timer);
timeLineBar->addItem(timeline);
//timeline->setFlag(QGraphicsItem::ItemIsFocusable);
//timeline->setFocus();
}

Here is my Timeline class implementation:

TimeLine::TimeLine(Timers *t)
{
    timer = new Timers;
    timer = t;
    timeLineWidth = 200000;
    timeLineScale = 0.1;
}

QRectF TimeLine::boundingRect() const
{
    return QRectF(0,0,timeLineWidth,18);
}

void TimeLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF rect = boundingRect();

    QPen pen(Qt::NoPen);
    painter->setPen(pen);
    painter->setBrush(QColor(200,200,200));
    painter->drawRect(rect);

    for(int i=0;i<200;i++)
    {
        painter->drawText(i*30,9,QString::number(i+1));
    }

}

void TimeLine::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        timer->start();
    }
}

And header of my class:

#ifndef TIMELINE_H
#define TIMELINE_H

#include <QObject>
#include <QColor>
#include <QRect>
#include <QGraphicsRectItem>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include "timers.h"

class TimeLine: public QGraphicsRectItem
{
public:
    TimeLine(Timers *t);
    QRectF boundingRect() const;

    void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget);

    float timeLineScale;
    int timeLineWidth;
    void mousePressEvent(QGraphicsSceneMouseEvent * event);

private:
    Timers *timer;

protected:

    void mouseReleaseEvent(QGraphicsSceneMouseEvent * event);


};

#endif // TRACK_H

Upvotes: 0

Views: 687

Answers (1)

eyllanesc
eyllanesc

Reputation: 243887

The problem is caused by overwriting the boundingRect() method, how are you inheriting from QGraphicsRectItem it is correct to use setRect()

timeline.h

#ifndef TIMELINE_H
#define TIMELINE_H

#include "timers.h"
#include <QGraphicsRectItem>

class TimeLine : public QGraphicsRectItem
{
public:
    TimeLine(Timers *t, QGraphicsItem *parent = 0);
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
    int timeLineWidth;
    float timeLineScale;
    Timers *timer;
};

#endif // TIMELINE_H

timeline.cpp

#include "timeline.h"

#include <QGraphicsSceneMouseEvent>
#include <QPainter>
#include <QTimer>

TimeLine::TimeLine(Timers *t, QGraphicsItem *parent):QGraphicsRectItem(parent)
{
    timer = t;
    timeLineWidth=200000;
    setRect(QRectF(0,0,timeLineWidth,18));
    timeLineScale = 0.1;

}

void TimeLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option)
    Q_UNUSED(widget)
    QRectF rect = boundingRect().toRect();

    QPen pen(Qt::NoPen);
    painter->setPen(pen);
    painter->setBrush(QColor(200,200,200));
    painter->drawRect(rect);

    painter->setPen(Qt::red);
    for(int i=0;i<200;i++)
    {
        painter->drawText(i*30,9,QString::number(i+1));
    }
}


void TimeLine::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
        timer->start();
}

Note: it is not necessary to create a Timers inside TimeLine: timer = new Timers; since afterwards you are changing the direction of the pointer and therefore that space is unusable besides that it is unnecessary.

In the following link you will find the project that you use to test the functionality.

Upvotes: 1

Related Questions