2017-11-16 23 views
0

私のシーンをクリックすると何も起こりません。私はQMouseEventとQGraphicsSceneMouseEventを使っていろいろなメソッドを試してみました。私のオブジェクトにフォーカスを当てて、それをクリックしようとしましたが結果はありませんでした。私はまた、他の人の投稿でインターネット上の解決策を探していましたが、私にとってはうまくいくものは見つかりませんでした。どこで私は間違いをするのですか?ここでQt: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(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 
+0

代わりに_QGraphicsView :: mousePressEvent_を試してください – scopchanov

+0

私の例ではあなたのソリューションの使い方がわかりません。 –

+0

あなたの目標は何ですか?あなたはマウスイベントを得ることができるときに何をしたいですか? QGraphicsItemには、異なる方法で処理されるいくつかのアクションがあります。 – eyllanesc

答えて

1

問題はどのようにあなたがそれを使用する正しいQGraphicsRectItemから継承され、boundingRect()方法を上書きすることによって引き起こされ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(); 
} 

注:タイムラインの内側にタイマーを作成する必要はありません。timer = new Timers;後であなたはポインタの方向を変更しているので、そのスペースは不要であるということ以外は使用できません。

linkには、機能のテストに使用するプロジェクトがあります。

+0

あなたのソリューションは素晴らしいです!私のタイマーへのポインタについてのアドバイスをありがとうございました。私はQ_UNUSED()関数についても知らなかった - 未使用の変数が私に迷惑をかけていた。私のメンターになってください。] –

関連する問題