【问题标题】: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();
}}

【问题讨论】:

    标签: c++ qt qgraphicsview qgraphicsscene


    【解决方案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 稍后“删除”它。

    【讨论】:

    • 谢谢,您的回复节省了我的时间,该项目现在可以运行了。
    • 很高兴听到这个消息!祝你编码好运。
    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2019-04-27
    • 2018-06-29
    相关资源
    最近更新 更多