2017-04-30 15 views
0

mousePressEvent 메서드를 사용할 수 있도록 QGraphicsView을 직접 만들었습니다. 그런 다음 "새"위젯을 MainWindow에 추가합니다. 이제 해당 객체의 장면에 액세스해야하지만 액세스하는 데 문제가 있습니다.QGridLayout의 사용자 지정 개체에서 Qt 액세스 변수

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에있는 버튼을 가지고 있으며 클릭 이벤트는 MyQGraphicsViewscene에서 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)); 
} 

그리고 버튼을 클릭 한 후 그 종료 (충돌) 응용 프로그램을 수행합니다.

답변

1

이 아니라 MyQGraphicsViewQLayoutItem::widget을 사용해야합니다. dynamic_cast<MyQGraphicsView *>(myView)의 결과를 확인한 경우 NULL을 반환하는 것으로 나타났습니다. RTT 지원이 필요하지 않은 dynamic_cast 대신 qobject_cast을 사용하는 것이 유용 할 수 있습니다. 당신은 아무것도를 캐스팅 할 필요가 없습니다, MainWindow의 구성원으로 MyQGraphicsView 객체를 저장하는 것입니다

청소기 솔루션입니다.

+1

'MainWindow'의 멤버로서'MyQGraphicsView' 오브젝트를 추가하는 것이 제 생각에는 최선의 방법이라고 생각합니다. – Croolman

+0

@Cololman 나는 너와 절대적으로 동의한다. – m7913d