Пользовательский QGraphicsPixmapItem не отображает растровое изображение - PullRequest
1 голос
/ 25 февраля 2020

Я создал собственный QGraphicsPixMap QGraphicsItem, так как мне нужно иметь функции, которые запускаются, когда кто-то нажимает на него! Заголовок для этого показан ниже:

#ifndef NEWGPIXMAP_H
#define NEWGPIXMAP_H

#include <QObject>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>

class NewGPixmap : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
public:
    NewGPixmap();
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
//    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
//    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};

#endif // NEWGPIXMAP_H

И. cpp для этого можно увидеть здесь:

#include "newgpixmap.h"
#include <iostream>
#include <QPointF>

NewGPixmap::NewGPixmap()
{

}

void NewGPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF pos = event->pos();
    int x = pos.x();
    int y = pos.y();

    std::cout<<x<<" "<<y<<std::endl;
}

Когда я пытаюсь обновить растровое изображение в QGraphicsScene ( хранится в переменной с именем "scene"). Я не получаю ошибок, однако PixMap не отображается.

Это код, который я использовал до реализации моей собственной QGraphicsPixMap, которая работала нормально:

void MainWindow::on_openImage_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"));
    QImage image(fileName);
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
    scene->clear();
    scene->addItem(item);
}

И теперь, когда я использую свою собственную реализацию QGraphicsPixMap, у меня есть следующий код:

void MainWindow::on_openImage_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"));
    QImage image(fileName);
    NewGPixmap item;
    item.setPixmap(QPixmap::fromImage(image));
    scene->clear();
    scene->addItem(&item);
}

Проблема в том, что растровое изображение не загружается в QGraphicsScene.

Спасибо за ваше помощь!

1 Ответ

2 голосов
/ 25 февраля 2020

Переменные уничтожаются, когда заканчивается их область действия, в вашем случае «NewGPixmap item;» это локальная переменная, поэтому она будет удалена по завершении работы on_openImage_triggered. Если вы хотите, чтобы объект не зависел от жизненного цикла переменной, вы должны использовать указатель, как в примере с QGraphicsPixmapItem:

void MainWindow::on_openImage_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"));
    QImage image(fileName);
    NewGPixmap *item = new NewGPixmap;
    item->setPixmap(QPixmap::fromImage(image));
    scene->clear();
    scene->addItem(item);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...