QGraphicsView 啥都不显示

Posted

技术标签:

【中文标题】QGraphicsView 啥都不显示【英文标题】:QGraphicsView shows nothingQGraphicsView 什么都不显示 【发布时间】:2013-03-06 01:21:36 【问题描述】:

我还在学习 Qt,我在 Qt 中做了一个小项目,我使用 qt ui 设计器创建了一个简单的 ui,并使用 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();

【问题讨论】:

【参考方案1】:

QGraphicsScene,以及大部分Qt,takes ownership的变量。变量应该是动态分配的。

在堆栈上创建的变量将不起作用,因为它们的生命周期太短,QObject 稍后会尝试删除它们。

你需要用'new'创建你的QGraphicsPixmapItem。

ui->graphicsView->scene()->addItem(new QGraphicsPixmapItem(QPixmap::fromImage(image)));

QObject 继承的所有东西都可以拥有(并被其他QObject 类拥有。当一个 QObject 被销毁时,它会在其所有子对象上调用“删除”。 QObject 类想要“拥有”他们的孩子。 “拥有”是指控制其生命周期。

在您的情况下,您正在堆栈上创建 QObject (QGraphicsPixmapItem)。然后它的生命周期由堆栈控制(但 QObject 认为它正在控制它),并且堆栈将在它到达该 'addItem()' 函数调用。

作为一般的 C++ 经验法则,如果一个函数请求一个指针,不要给它一个临时(未命名的)对象。 作为一般的 Qt 经验法则,如果一个函数要求一个指针,甚至不要给它一个命名的局部变量——大多数人想要一个动态分配的变量,所以在 the documentation 上查找函数并查看是否它提到“取得所有权”。如果是这样,“新建”它并让 Qt 稍后“删除”它。

【讨论】:

谢谢,您的回复节省了我的时间,该项目现在可以运行了。 很高兴听到这个消息!祝你编码好运。

以上是关于QGraphicsView 啥都不显示的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL啥都不显示?

清理推文,啥都不显示

Vue js啥都不显示

Python字典啥都不显示

使用 v-if 时啥都不显示

gtkmm Append_column(TreeViewColumn) 啥都不显示