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

Alles rund um die Programmierung mit Qt
Antworten
WolfgangP3
Beiträge: 4
Registriert: 4. Oktober 2007 15:54

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

Beitrag 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)
Dateianhänge
ctrlitem.cpp
(3.01 KiB) 111-mal heruntergeladen
ctrlitem.h
(1.16 KiB) 120-mal heruntergeladen
Zuletzt geändert von WolfgangP3 am 22. Dezember 2007 23:34, insgesamt 1-mal geändert.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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);
        }
}

.........................
speack português italiano deutsch english castellà qt
WolfgangP3
Beiträge: 4
Registriert: 4. Oktober 2007 15:54

Beitrag 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!
Antworten