Я все еще изучаю Qt, я сделал небольшой проект в Qt, я создаю простой пользовательский интерфейс, используя Qt UI Designer, и использую QGraphicsView для отображения изображения, загруженного QFileDialog, но когда я добавил загруженный файл изображения в QgraphicsScene, изображение не отображается в графическом представлении. Графическое изображение остается пустым, пожалуйста, помогите мне, спасибо!
Project2::Project2(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui = new Ui::Project2Class;
ui->setupUi(this);
this->scene = new QGraphicsScene;
this->scene->setSceneRect(0, 0, 649, 459);
connect(ui->mapLoaderButton, SIGNAL(clicked()), this, SLOT(GetfilePath()));ui->graphicsView->setScene(this->scene);
}void Project2::GetfilePath()
{
QString filePath = QFileDialog::getOpenFileName(this, tr("Select file"), "", tr("Files (*.jpg*)"));
if (filePath.isNull() == false)
{
QImage image(filePath);
QSize size = image.size();
ui->graphicsView->scene()->addItem(&QGraphicsPixmapItem(QPixmap::fromImage(image)));
ui->graphicsView->scene()->update();
ui->graphicsView->viewport()->update();
}}
QGraphicsScene, и большая часть Qt, вступает во владение переменной. Переменная должна быть динамически размещена.
Переменные, созданные в стеке, не будут работать, потому что их время жизни слишком короткое, и QObject позже попытается их удалить.
Вам нужно создать свой QGraphicsPixmapItem с «новым».
ui->graphicsView->scene()->addItem(new QGraphicsPixmapItem(QPixmap::fromImage(image)));
Все, что наследуется от QObject может владеть (и принадлежать) другим QObject классы. Когда QObject уничтожается, он вызывает «удалить» всех своих детей. QObject классы хотят «владеть» своими детьми. Под «своим» я подразумеваю контроль над временем жизни.
В вашем случае вы создавали QObject (QGraphicsPixmapItem) в стеке. Это время жизни затем контролируется стеком (но QObject думает, что контролирует его), и стек удалит его, когда достигнет точки с запятой этого ‘Добавьте предмет()‘вызов функции.
Как общее правило C ++, если функция запрашивает указатель, не давайте ей временный (неназванный) объект.
Как общее правило Qt, если функция запрашивает указатель, даже не присваивайте ей именованную локальную переменную — большинству нужна динамически размещаемая переменная, поэтому посмотрите на функцию документация и посмотрим, не упоминается ли «принятие собственности». Если так, ‘новый«это и пусть Qt позже»удалять‘ Это.
Других решений пока нет …