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 啥都不显示的主要内容,如果未能解决你的问题,请参考以下文章