我还在学习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();
}}
答案 0 :(得分:3)
QGraphicsScene ,以及变量的大部分Qt,takes ownership。该变量应该动态分配。
在堆栈上创建的变量不起作用,因为它们的生命周期太短,QObject稍后会尝试删除它们。
您需要使用'new'创建QGraphicsPixmapItem。
ui->graphicsView->scene()->addItem(new QGraphicsPixmapItem(QPixmap::fromImage(image)));
从 QObject 继承的所有内容都可以拥有(并拥有)其他 QObject 类。当 QObject 被销毁时,它会对其所有子项调用“delete”。 QObject 课程希望“拥有”他们的孩子。 “拥有”是指控制生命的时间。
在您的情况下,您正在堆栈上创建 QObject (QGraphicsPixmapItem)。它的生命周期然后由堆栈控制(但 QObject 认为它正在控制它),并且堆栈将在它到达' addItem()<的分号时删除它/ strong>'函数调用。
作为一般的C ++经验法则,如果函数要求指针,请不要给它一个临时(未命名)对象。 作为一般的Qt经验法则,如果一个函数要求一个指针,甚至不给它一个命名的局部变量 - 最想要一个动态分配的变量,所以在the documentation上查看该函数并且看看它是否提到“取得所有权”。如果是这样,'新',请让Qt稍后“删除”。