我创建了自己的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>
单击按钮后会关闭(崩溃)应用程序。
答案 0 :(得分:1)
您不应将QLayoutItem
,QLayoutItem::widget
投射到MyQGraphicsView
。如果您检查了dynamic_cast<MyQGraphicsView *>(myView)
的结果,您会注意到它返回NULL
。请注意,使用qobject_cast
代替dynamic_cast
可能很有用,但不需要RTTI支持。
更清洁的解决方案是将MyQGraphicsView
对象存储为MainWindow
的成员,因此您无需投射任何内容。