QGraphicsScene addItem与智能指针

时间:2015-02-17 12:08:05

标签: qt c++11 smart-pointers

我在使用Qt智能指针时遇到问题。我无法弄清楚这种奇怪行为的原因是什么。 简单设置: 我创建了一个新的Qt Widgets应用程序并将QGraphicsView拖到主窗口中,并且只添加了以下代码来绘制圆圈:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QGraphicsScene"
#include "QGraphicsEllipseItem"
#include "boost/shared_ptr.hpp"
#include "QSharedPointer"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QGraphicsScene* scene = new QGraphicsScene(ui->graphicsView);
    ui->graphicsView->setScene(scene);

    /* 1. raw pointer */
    QGraphicsEllipseItem* ell = new QGraphicsEllipseItem(100,100,50,50);
    scene->addItem(ell);

    /* 2. boost shared pointer
    boost::shared_ptr<QGraphicsEllipseItem> eSP(new QGraphicsEllipseItem(100,100,50,50));
    scene->addItem(eSP.get());*/

    /* 3. Qt shared pointer
    QSharedPointer<QGraphicsEllipseItem> eSP(new QGraphicsEllipseItem(100,100,50,50));
    scene->addItem(eSP.data());*/

    /* 4a. raw pointer as init parameter for shared pointer
    QGraphicsEllipseItem* ell = new QGraphicsEllipseItem(100,100,50,50);
    boost::shared_ptr<QGraphicsEllipseItem> eSP(ell);
    scene->addItem(eSP.get()); // using shared pointer */

    /* 4b. raw pointer as init parameter for shared pointer
    QGraphicsEllipseItem* ell = new QGraphicsEllipseItem(100,100,50,50);
    boost::shared_ptr<QGraphicsEllipseItem> eSP(ell);
    scene->addItem(ell); // using raw pointer */
}

MainWindow::~MainWindow()
{
    delete ui;
}

如你所见,我尝试了一些变种。第一个是唯一有效的。它在QGraphicsView的中心画一个圆圈。但对于我的项目,我需要一个智能指针实现。但是所有智能指针实现都不会绘制圆圈。 我犯了什么错误吗?

特别是4b最让我感到困惑。与1的唯一区别是我将原始指针另外放入共享指针并且不起作用

请帮助我!

我的环境:

- Linux Mint 17.1
- qt-sdk 2ubuntu3
- boost 1.54.0.1

0 个答案:

没有答案