未调用 QGraphicsSceneMouseEvent
Posted
技术标签:
【中文标题】未调用 QGraphicsSceneMouseEvent【英文标题】:QGraphicsSceneMouseEvent is not called 【发布时间】:2017-11-16 11:10:38 【问题描述】:当我点击我的场景时 - 没有任何反应。我使用QMouseEvent
和QGraphicsSceneMouseEvent
尝试了许多不同的方法,尝试将焦点设置在我的对象上,然后尝试单击它 - 没有结果。我也在互联网上寻找其他人的帖子的解决方案,但没有找到任何适合我的方法。我在哪里犯错?
下面是一些代码:
这是我的一个窗口,我在其中创建场景、视图和对象 - 我希望对鼠标事件做出响应:
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();
这是我的 Timeline 类实现:
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();
还有我班级的标题:
#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
【问题讨论】:
尝试 QGraphicsView::mousePressEvent 代替 我不知道如何在我的示例中使用您的解决方案。 你的目标是什么?当你可以得到鼠标事件时你想做什么? QGraphicsItem 有几个不同处理的动作。 我想在按下鼠标按钮时启动我的计时器。有一行:'timer->start();'启动计时器。我希望当我单击时间轴上的任意位置时,执行一项操作。 您的场景显示在 QGraphicsView 中,对吗?重新实现 QGraphicsView::mousePressEvent 根据需要启动计时器。 【参考方案1】:问题是覆盖boundingRect()
方法引起的,你怎么继承QGraphicsRectItem
使用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();
注意:不需要在TimeLine里面创建Timers:timer = new Timers
;因为之后你正在改变指针的方向,因此除了它是不必要的之外,这个空间是不可用的。
在下面的link
中,您将找到用于测试功能的项目。
【讨论】:
您的解决方案很棒!非常感谢您提供有关指向我的计时器的建议。我也不知道 Q_UNUSED() 函数——未使用的变量让我很恼火。请成为我的导师;]以上是关于未调用 QGraphicsSceneMouseEvent的主要内容,如果未能解决你的问题,请参考以下文章
numberOfRowsInSection 已调用但 cellForRowAt 未调用
调用 textFieldShouldBeginEditing,未调用 textFieldDidBeginEditing