3

我还在学习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();
}}
4

1 回答 1

3

QGraphicsScene和 Qt 的大部分内容都拥有该变量的所有权。变量应该是动态分配的。

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

您需要使用“新”创建 QGraphicsPixmapItem。

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

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

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

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

于 2013-03-06T01:40:10.990 回答