Seite 1 von 1

[gelöst] QGraphicsTextItem - Signal bei Textänderung

Verfasst: 22. Dezember 2007 18:16
von WolfgangP3
Mein Problem ist folgendes: Für eine meiner QGraphicsItem - Subklassen (sie hat ein QGraphicsTextItem als Child- Item) brauche ich etwas in der Art:

Code: Alles auswählen

signals:
    void textChanged(QString); //<-bezieht sich auf das child der Klasse
Leider habe ich in der Qt- Doc nichts entsprechendes für TextItems finden können und es deshalb mit einem eventFilter versucht:

Meine Idee war, die QInputMethodEvent's des Textitems aufzuspüren und daraufhin ein entsprechendes Signal zu senden. Aber alles was meine EventFilter- Funktion filtert, sind Events von event()->type() 67 und 70, die ich in der Doku nicht mal finden kann...

Und

Code: Alles auswählen

dynamic_cast<QInputMethodEvent*>(event)

in der EventFilter - Funktion liefert ebenfalls immer 0.
Wo könnte das Problem liegen? Gibts eine bessere/gar keine Lösung für das Ganze ? (Source- und Headerdatei meiner Klasse im Anhang)

Verfasst: 22. Dezember 2007 21:02
von patrik08
Dass ist ein funktionierendes teil das die genaue Hoehe des QGraphicsTextItem rechnet um eine neue height zu geben da ich sie von anfang an auf 100x100 sperre ... um text aenderung zu erfahren muss du nur noch das den text oder das wort erfassen ... mit document() oder QTextBlock ... in diese elemente kann man einfach nicht QTextEdit dinamic casten..

source http://fop-miniscribus.googlecode.com/s ... iagram.cpp

Code: Alles auswählen


void FloatDiagram::keyPressEvent ( QKeyEvent * event ) 
{
    if (!isSelected()) {
    return;
    }
    
    if (modus == M_LOCK) {
    return;
    }
    LayerHightChecks();
    QGraphicsTextItem::keyPressEvent(event);
}


int FloatDiagram::DocumentHighgtActual() 
{
    int HightLayerSumms = 0;
    QAbstractTextDocumentLayout *Layout = document()->documentLayout();
     QTextFrame  *Tframe = document()->rootFrame();
        QTextFrame::iterator it;
        for (it = Tframe->begin(); !(it.atEnd()); ++it) {
         QTextBlock para = it.currentBlock();
             if (para.isValid()) {
                HightLayerSumms += Layout->blockBoundingRect(para).height();
             }
        }
        
    return HightLayerSumms;
}

void FloatDiagram::LayerHightChecks() 
{
        int txthight = DocumentHighgtActual();
        if (txthight > hi) {
        SetDimension(wi,txthight);
        }
}


Verfasst: 22. Dezember 2007 23:57
von WolfgangP3
Die Lösung ist banal, wenn man sie kennt :roll::

Will man ein Signal senden, sobald sich der Inhalt eines QGraphicsTextItem verändert, geht man einfach so vor:

Code: Alles auswählen

QGraphicsTextItem *textItem;

QObject::connect(textItem->document(), SIGNAL(contentsChanged()), 
				this, SIGNAL(textChanged()));
Ein Großteil der Funktionalität des QGraphicsTextItem steckt nämlich in seinem document() (Qt- Klasse die formatierten Text speichert) - wenn man also allgemein irgendetwas am umgang des textItems mit seinem Text verändern möchte, ist das document() des Items vermutlich der richtige Ansatzpunkt.

Und danke noch für die schnelle Hilfe, die mich auf diese Lösung gebracht hat!