Qt QGraphicsScene无法从QGraphicsView访问(在Qt 5.6.1上)

时间:2017-08-18 16:59:33

标签: qt qgraphicsview qgraphicsscene

我是Qt的新手。我试图抓住鼠标按下并在QGraphicsView区域释放并画一条线。为此,我扩展了QGraphicsView并将其称为myQGraphicsView。由于我添加了一个" Hello World "似乎没有正确附加场景。它永远不会出现在视图中。这是我的扩展类的代码:

class myQGraphicsView : public QGraphicsView
{
  Q_OBJECT

public:

myQGraphicsView(QGraphicsScene *scene, QWidget *parent = Q_NULLPTR) : QGraphicsView(scene,parent){
     //  QGraphicsView::QGraphicsView(scene,parent);
}


 QPoint *pointPtr, *startPos,*endPos;
 QGraphicsView *cv;//MAA
 QGraphicsScene *c;
 QGraphicsScene *scenePtr; // MAA
protected:
void paintEvent(QPaintEvent *event) {

      show();

}

void mousePressEvent(QMouseEvent *event) {
    // pos is wrt widget. Global is wer to global screen
    qDebug()<<" Mouse pressed at "<<QWidget::mapFromGlobal(event->globalPos()); //globalX();
    startPos = new QPoint;
    startPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
    startPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());

}

void mouseReleaseEvent(QMouseEvent *event) {
   qDebug()<<" Mouse relase pressed at x="<<event->globalPos().x()<<" y ="<<event->globalPos().y();
   endPos = new QPoint;
   endPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
   endPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());
   c->addLine(0,0,50,50);
   update();
}

void mouseMoveEvent ( QMouseEvent * event )
{
  //Show x and y coordinate values of mouse cursor here
  qDebug()<<"X:"<<QString::number(event->x())<<"-- Y:"<<QString::number(event->y());
  endPos = new QPoint;

}


}

似乎检测到鼠标并调用正确的方法。但是,&#34; hello world &#34;也不会在视图中绘制线条。我在视图上尝试了cv1->setScene,但也没有做任何事情。

所以我声明了一个名为cv2的第二个视图指针,它正在使用QGraphicsView。所有的信息似乎在那里工作得很好,它会被淹死。我仔细阅读了帖子,似乎他们建议设置事件过滤器,因此我将其添加到两个视图中(cv1cv2)。事件过滤器只返回所有事件的false(这应该是文档中的默认行为)。它没有做任何事情。 以下是cv1cv2的great.cpp中的代码段。请注意,在cv1mymyQGraphicsView实例)中,我创建了一个指向场景的指针(称为c)并被分配c1,因此我可以addLine到它。

        c1 = new QGraphicsScene(0,0,500,300,this); 

    text= c1->addText("Hello, world!");

    text->setFlag(QGraphicsItem::ItemIsMovable);
    text->setVisible(true);
    cv1 = new myQGraphicsView(c1,this);
    cv2= new QGraphicsView(c1,this);
    KeyPressEater *keyPressEaterPtr = new KeyPressEater(this);
    cv1->installEventFilter(keyPressEaterPtr);
    cv2->installEventFilter(keyPressEaterPtr);
    cv1->c =c1;

    layout = new QGridLayout;
    layout->addWidget(topLabel,0,0);
    layout->addWidget(wellCoord,1,0);
    layout->addWidget(cv1,1,1,1,-1); <-view is added to a great class
    layout->addWidget(TimeStepGroup,2,0);
    setLayout(layout);

最后,这里是great.h:

 myQGraphicsView *cv1;//MAA
 QGraphicsView *cv2;//MAA

 QGraphicsScene *c1; // MAA 
 public:
 void paintEvent(QPaintEvent *event) {
    // MAA

    cv2->show();
  }
  protected:

  void mousePressEvent(QMouseEvent *event) {

    qDebug()<<"gridwell Mouse pressed at "<<QWidget::mapFromGlobal(event->globalPos()); //globalX();
    startPos = new QPoint;
    startPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
    startPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());
    QWidget::mousePressEvent(event);

}
void mouseReleaseEvent(QMouseEvent *event) {

    qDebug()<<"gridwell Mouse released at x="<<event->globalPos().x()<<" y ="<<event->globalPos().y();
   QWidget::mouseReleaseEvent(event);
    endPos = new QPoint;
   endPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
   endPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());

   lineItemPtr = c1->addLine(startPos->x(),startPos->y(),(endPos->x())- (startPos->x()),(endPos->y())-(startPos->y()) );
   lineItemPtr->setVisible(true);
   cv2->update();
}

void mouseMoveEvent ( QMouseEvent * event )
{
  //Show x and y coordinate values of mouse cursor here
  qDebug()<<"gridwell X:"<<QString::number(event->x())<<"-- Y:"<<QString::number(event->y());
  endPos = new QPoint;

}

最后,这是我从文档中剪切并粘贴的keyEater

class KeyPressEater : public QObject
{
  Q_OBJECT
 public:
  KeyPressEater(QObject *parent = Q_NULLPTR) : QObject (parent){
  }

protected:

  bool eventFilter(QObject *obj, QEvent *event)
  {

    return(false); // propagates events
  }
};

为什么cv1没有得到场景c1的任何想法(因为它甚至不打印&#34; hello world &#34;。但是{{1做什么?

感谢您的帮助!

更新:我做了更多调查并更改了以下例程:

cv2

现在,当我在cv1视图区域内单击时,我看到cv2中的行,因为cv2和cv1视图都指向同一个场景(cv1-&gt; c = c1;在great.cpp中的行)。这证明了在cv2中没有正确映射场景,因为即使是&#34; Hello World&#34;出现。我很困惑,因为这似乎是一个简单的对象传递给构造函数,如许多例子所示。

0 个答案:

没有答案