Correction d'une segfault survenant avec Qt 4.4

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@349 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2008-07-17 22:57:50 +00:00
parent 429d7e55a2
commit 158cf97bb3
3 changed files with 27 additions and 12 deletions

View File

@@ -37,9 +37,10 @@ Diagram::Diagram(QObject *parent) :
draw_grid(true), draw_grid(true),
use_border(true), use_border(true),
moved_elements_fetched(false), moved_elements_fetched(false),
qgi_manager(this),
draw_terminals(true) draw_terminals(true)
{ {
undo_stack = new QUndoStack();
qgi_manager = new QGIManager(this);
setBackgroundBrush(Qt::white); setBackgroundBrush(Qt::white);
conductor_setter = new QGraphicsLineItem(0, 0); conductor_setter = new QGraphicsLineItem(0, 0);
conductor_setter -> setZValue(1000000); conductor_setter -> setZValue(1000000);
@@ -59,8 +60,23 @@ Diagram::Diagram(QObject *parent) :
Destructeur Destructeur
*/ */
Diagram::~Diagram() { Diagram::~Diagram() {
if (conductor_setter -> scene()) removeItem(conductor_setter); // suppression de la liste des annulations - l'undo stack fait appel au qgimanager pour supprimer certains elements
delete conductor_setter; delete undo_stack;
// suppression du QGIManager - tous les elements qu'il connait sont supprimes
delete qgi_manager;
// recense les items supprimables
QList<QGraphicsItem *> deletable_items;
foreach(QGraphicsItem *qgi, items()) {
if (qgi -> parentItem()) continue;
if (qgraphicsitem_cast<Conductor *>(qgi)) continue;
deletable_items << qgi;
}
// suppression des items supprimables
foreach(QGraphicsItem *qgi_d, deletable_items) {
delete qgi_d;
}
} }
/** /**
@@ -469,7 +485,7 @@ bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_in
*/ */
void Diagram::diagramTextChanged(DiagramTextItem *text_item, const QString &old_text, const QString &new_text) { void Diagram::diagramTextChanged(DiagramTextItem *text_item, const QString &old_text, const QString &new_text) {
if (!text_item) return; if (!text_item) return;
undo_stack.push(new ChangeDiagramTextCommand(text_item, old_text, new_text)); undo_stack -> push(new ChangeDiagramTextCommand(text_item, old_text, new_text));
} }
/** /**

View File

@@ -75,8 +75,8 @@ class Diagram : public QGraphicsScene {
QSet<Conductor *> conductors_to_move; QSet<Conductor *> conductors_to_move;
QHash<Conductor *, Terminal *> conductors_to_update; QHash<Conductor *, Terminal *> conductors_to_update;
QSet<DiagramTextItem *> texts_to_move; QSet<DiagramTextItem *> texts_to_move;
QGIManager qgi_manager; QGIManager *qgi_manager;
QUndoStack undo_stack; QUndoStack *undo_stack;
bool draw_terminals; bool draw_terminals;
// methodes // methodes
@@ -253,12 +253,12 @@ inline const QSet<DiagramTextItem *> &Diagram::textsToMove() {
/// @return la pile d'annulations de ce schema /// @return la pile d'annulations de ce schema
inline QUndoStack &Diagram::undoStack() { inline QUndoStack &Diagram::undoStack() {
return(undo_stack); return(*undo_stack);
} }
/// @return le egstionnaire de QGraphicsItem de ce schema /// @return le egstionnaire de QGraphicsItem de ce schema
inline QGIManager &Diagram::qgiManager() { inline QGIManager &Diagram::qgiManager() {
return(qgi_manager); return(*qgi_manager);
} }
/// @return true si les bornes sont affichees, false sinon /// @return true si les bornes sont affichees, false sinon

View File

@@ -30,6 +30,7 @@
@param parent Le QWidegt parent de cette vue de schema @param parent Le QWidegt parent de cette vue de schema
*/ */
DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent), is_adding_text(false) { DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent), is_adding_text(false) {
setAttribute(Qt::WA_DeleteOnClose, true);
setInteractive(true); setInteractive(true);
setCacheMode(QGraphicsView::CacheBackground); setCacheMode(QGraphicsView::CacheBackground);
setOptimizationFlags(QGraphicsView::DontSavePainterState|QGraphicsView::DontAdjustForAntialiasing); setOptimizationFlags(QGraphicsView::DontSavePainterState|QGraphicsView::DontAdjustForAntialiasing);
@@ -422,10 +423,8 @@ void DiagramView::closeEvent(QCloseEvent *event) {
default: retour = true; // l'utilisateur dit non ou ferme le dialogue: c'est reussi default: retour = true; // l'utilisateur dit non ou ferme le dialogue: c'est reussi
} }
} }
if (retour) { if (retour) event -> accept();
event -> accept(); else event -> ignore();
delete this;
} else event -> ignore();
} }