Qt从QGridLayout的自定义对象访问变量

时间:2017-04-30 17:33:51

标签: c++ qt qgraphicsscene

我创建了自己的QGraphicsView,因此我可以使用mousePressEvent方法。然后我添加" new"小部件到MainWindow。现在我需要从该对象访问一个场景,但我无法访问它。

privqgraphicsview.cpp

#include "privqgraphicsview.h"
#include <QPointF>

MyQGraphicsView::MyQGraphicsView(QWidget *parent) :
    QGraphicsView(parent)
{
    scene = new QGraphicsScene();
    this->setSceneRect(-320, -290, 660, 580);
    this->setScene(scene);
    this->setRenderHint(QPainter::Antialiasing);
}

privqgraphicsview.h

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QMouseEvent>

   class MyQGraphicsView : public QGraphicsView
   {
       Q_OBJECT
   public:
       explicit MyQGraphicsView(QWidget *parent = 0);
       QGraphicsScene * scene;

   public slots:
       void mousePressEvent(QMouseEvent * e);

   };

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "privqgraphicsview.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // gridLayout is defined in mainwindow.h
    gridLayout = new QGridLayout(ui->centralWidget);
    gridLayout->addWidget( new MyQGraphicsView() );
}

MainWindow::~MainWindow()
{
    delete ui;
}

现在,我在MainWindow点击了一个按钮,我想要点击MyQGraphicsView来自scene gridLayout void MainWindow::on_connectPointsPB_clicked() { QLayoutItem *myView = gridLayout->itemAt(0); // trying to draw a simple line, code below does not check anything, I am aware of it dynamic_cast<MyQGraphicsView *>(myView)->scene->addLine(10,10,50,50, QPen(Qt::red, 3)); } 点的点击事件。我尝试过这样的事情:

{% load account %} {# this should be near the top with any other load tags #}

{# this can be anywhere in the template. I'm not positive what it returns but it looks like it is the username. #}
<p>
    {% user_display user %}
</p>

单击按钮后会关闭(崩溃)应用程序。

1 个答案:

答案 0 :(得分:1)

您不应将QLayoutItemQLayoutItem::widget投射到MyQGraphicsView。如果您检查了dynamic_cast<MyQGraphicsView *>(myView)的结果,您会注意到它返回NULL。请注意,使用qobject_cast代替dynamic_cast可能很有用,但不需要RTTI支持。

更清洁的解决方案是将MyQGraphicsView对象存储为MainWindow的成员,因此您无需投射任何内容。