Qt删除场景后是否删除了我的项目?我的程序架构得很好吗?

时间:2014-06-02 09:07:56

标签: c++ qt architecture

现在有些日子,我被困住了。我不确定我的问题在哪里,架构?或者只是添加一个保护,让我的场景不删除我的项目?

这就是我的程序架构:

我的ui中有1个GraphView + 1 GraphScene,我在主窗口中使用SetCentralWidget切换ui。

我将所有项目保存在另一个类的QList或QVector中,我的所有窗口都有一个指向我的主窗口传递的这个类的指针。 (是的,我保存的所有物品都是公开的:......我知道这很糟糕,但我怎么办?)。

所以现在我遇到了这个问题:

1 - My primary windows create and initiate my "storage class"
1 - my first ui add items in the QList (in storage class)
2 - I destroy this ui and pass to another ui
3 - I try to add items added before in my QList, and my program crash :

// PointMesure = QGraphicsRectItem and "d_e" is the pointer to the "stockage class"
foreach(PointMesure *point_mesure, d_e->liste_points_mesures) {
    scene->addItem(point_mesure);
}

所以我认为问题是当我在第一个ui中摧毁场景时我的项目被删除了

我是新手所以也许我的程序架构不好......你怎么看?

很好;)

Stockage类标题:

class ConteneurDonneesEtude : public QObject
{
public:
    ConteneurDonneesEtude(QWidget *parent = 0);

public:

QList <PointMesure *> liste_points_mesures;     // Dérive de QGraphicsRectItem

private:
    QWidget *fenetre_principale;
};

我从XML文件加载:

void ConteneurDonneesEtude::creer_items_points_mesures(QXmlStreamReader *fichier_xml) {

    // Loading

    PointMesure *temp = new PointMesure();
    temp->setPos(QPointF(x, y));
    temp->setRect(QRect(-offset_centre, -offset_centre,
                        taille_point_mesure, taille_point_mesure));

    // set other things.... this part worked in another project anyway :)

    this->liste_points_mesures.insert(numero, temp);
}

我的第一个ui GraphView:

创作:

void FenetrePrincipale::slot_importer_etude() {
    fen_importer_etude = new FenetreImporterEtude(this, d_e);
    this->setCentralWidget(fen_importer_etude);

    connect(fen_importer_etude, SIGNAL(sig_continuer()), this, SLOT(slot_nommer_points()));
    connect(fen_importer_etude, SIGNAL(sig_retour()), this, SLOT(slot_importer_etude()));
}

然后:

void GraphImporterEtude::afficher_donnees_etude() {
    foreach(PointMesure *point_mesure, d_e->liste_points_mesures) {
        scene->addItem(point_mesure);
    }
}

我创建了另一个ui,setCentralWidget将自动创建。摧毁最后一个ui:

void FenetrePrincipale::slot_nommer_points() {
    fen_nommer_points = new FenetreNommerPointsMesure(this, d_e);
    this->setCentralWidget(fen_nommer_points);

    connect(fen_nommer_points, SIGNAL(sig_continuer()), this, SLOT(slot_integration_tacheo()));
    connect(fen_nommer_points, SIGNAL(sig_retour()), this, SLOT(slot_importer_etude()));
}

然后

void GraphNommerPointsMesure::afficher_points_mesures_actifs() {
    foreach(PointMesure *point_mesure, d_e->liste_points_mesures) {
        if(point_mesure->actif) {
            scene->addItem(point_mesure);
        }
    }
}

分段错误!

0 个答案:

没有答案