现在有些日子,我被困住了。我不确定我的问题在哪里,架构?或者只是添加一个保护,让我的场景不删除我的项目?
这就是我的程序架构:
我的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);
}
}
}
分段错误!