Объясните, как пользоваться указателями? - PullRequest
0 голосов
/ 09 мая 2020

Извините, я пользуюсь переводчиком Google. Я изучаю, как работает QGraphicsItem. Но я не понимаю, как данные передаются через указатели на сцену. Вот код

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qmyscene.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QMyScene(this);
    ui->graphicsView->setScene(scene);
    scene->setSceneRect(0,0,800,600);
    }

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

qmyscene. cpp

#include "qmyscene.h"
#include "qpixitem.h"
#include <qdebug.h>
QMyScene::QMyScene(QObject *parent) : QGraphicsScene(parent)
{
    QPixItem *pix1 = new QPixItem (this,100,100);
    QPixItem *pix2 = new QPixItem (this,50,50);
}
QMyScene::~QMyScene()
{
}

qpixitem. cpp

#include "qpixitem.h"
#include <QMessageBox>
QPixItem::QPixItem (QGraphicsScene *MyScene,int x,int y): QGraphicsPixmapItem()
{
    QPixmap  pic (":/Items/OutLet.png");
    this->setPixmap(pic);
    this->setPos(x, y);
    this->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
    qDebug() << "create";
    QGraphicsLineItem* line = MyScene->addLine(QLineF(40, 40, 80, 80));
    MyScene->addItem(this);
}
QVariant QPixItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
    if (change == ItemPositionChange)
      {
        QPointF newPos = value.toPointF();
        int p1 = newPos.x();
        int p2 = newPos.y();
        MyScene->addLine(QLineF(40,40,p1, p2)); //error
        //this->line->setLine(QLineF(40,40,p1, p2)); //error
        qDebug() << "Scene::move";
       }
      return QGraphicsItem::itemChange(change, value);
}

qmyscene.h

#ifndef QMYSCENE_H
#define QMYSCENE_H
#include <QGraphicsScene>
#include <QDebug>

class QMyScene: public QGraphicsScene
{
    Q_OBJECT
public:
    explicit QMyScene(QObject *parent = 0);
    ~QMyScene();

private:
};
#endif // QMYSCENE_H

qpixitem.h

#ifndef QPIXITEM_H
#define QPIXITEM_H
#include <QGraphicsItem>
#include "QGraphicsScene"
#include "mainwindow.h"
#include <QGraphicsPixmapItem>

class QPixItem: public QGraphicsPixmapItem
{
public:

    QPixItem (QGraphicsScene *MyScene,int x,int y);
    QGraphicsScene *MyScene;
    int x,y;

private:
    QGraphicsLineItem* line;
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
};
#endif // QPIXITEM_H

// ошибка - строки вызывают ошибку (закрытие программы из-за доступа к памяти), я уверен, что это из-за неправильного использования указателей. Как их правильно использовать в таком коде?

1 Ответ

0 голосов
/ 09 мая 2020

Кажется, вы никогда не выделяете this->line.

Возможно, вы имели в виду:

this->line = MyScene->addLine(QLineF(40, 40, 80, 80));

вместо

 QGraphicsLineItem* line = MyScene->addLine(QLineF(40, 40, 80, 80));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...