我创建了自己的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);

   };


主窗口

#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中来自scenegridLayout中的点。我已经尝试过这样的事情:

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));
}


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

最佳答案

您不应将QLayoutItem强制转换为QLayoutItem::widget。如果检查MyQGraphicsView的结果,您会注意到它返回dynamic_cast<MyQGraphicsView *>(myView)。请注意,使用NULL代替qobject_cast可能会很有用,因为它不需要RTTI支持。

一个更干净的解决方案是将您的dynamic_cast对象存储为MyQGraphicsView的成员,因此您无需进行任何转换。

关于c++ - 来自QGridLayout的自定义对象的Qt访问变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43709321/

10-14 08:13