Qt4 kérdés: szegmens hibával leáll a progi.

 ( pelz | 2008. április 16., szerda - 23:12 )

Sziasztok!

Qt4 programocska írásakor a következő problémába ütköztem:
Akarok egy olyan saját TextEdit osztályt létrehozni, ami úgy működne, hogy figyelem, hogy írt-e be valamit, és ha igen akkor egy bizonyos algoritmus alapján eldönteném, hogy hol kell pirosra színezni a szöveget. (A piros rész jelentené, hogy hol hibás már a bevitt szöveg.)
Mivel kezdő vagyok. Lefőttem. Szegmens hibával leáll a programom.

A saját TextEdit osztályom így néz ki:

class QRegExpValidator;

class QpjCheckTextEdit : public QTextEdit
{
		Q_OBJECT
	public:
		QpjCheckTextEdit(QWidget* parent = 0);
	private slots:
		void formatText();
	private:
		QRegExpValidator* validator;
};

QpjCheckTextEdit::QpjCheckTextEdit(QWidget* parent) 
	: QTextEdit(parent)
{
	QRegExp regExp;
	validator = new QRegExpValidator(regExp, this);
	QString pattern("[A-Za-z][1-9][0-9]{0,2}");
	regExp.setPattern(pattern);
	connect(this->document(), SIGNAL(contentsChanged()),
	        this, SLOT  (formatText())
	       );
	setText("Hello <font color=red>World!</font>");
}

void QpjCheckTextEdit::formatText()
{
		insertPlainText(" not OK ");
}

Az igazi tervem, az az hogy engedek beírni mindent, de pirossal kiszínezném, onnan a szöveget, ahonnan már a bevitt minta szerint rossz. A példában csak próbáltam egyáltalán beszúrni valamit a már meglévő szöveghez, ha a felhasználó módosít valamit a szövegen.

Mit kellene tennem, hogy közelebb jussak a megoldáshoz?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A Qt-hoz adott syntax highliter példát nézegetted már?

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Persze nézegettem, de nem sokra jutottam vele, mert nekem még magas.
De lehet, hogy igazad van és muszáj valahogy átrágnom magam rajta.

Sziasztok!

Pontosan mi az az ANCHOR? Több helyen találkozok vele, de nem fogtam még fel, hogy mit ért rajta a Qt.

Azt, amit általában :) Tehát szerintem html nyelvezettel élve egy hivatkozást. Bár horgonyként hivatkozik rá, mégis linkeket és "szakaszcímkéket" jelölnek vele. Célja pedig, hogy egyszerűsítse a szöveges dokumentumokban való navigációt.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Végtelen rekurzióra tippelek. Valószínűleg az insertPlainText miatt mindig generálódik újabb contentsChanged() signal.

Igen ez nagyon lehetséges, hisz a szöveg megváltoztatása idítja a slot függvényt, de a szöveg újra megváltozik ebben a slotban, ezért folyamatos egymásra hivatkozás generálódik.

Nincs vajon olyan signal függvény, ami csak akkor emittálódik, ha a felhasználó változtatja meg a szöveget? Ha programból változtatjuk, akkor ne érkezzen signal.

Indítsd el a Qt4 Assistant-ot, abban megtalálod az összes API-val kapcsolatos kérdésed.
assistant
____________________________________________________________
Slackware 12.1 - linux-2.6.25-olorin - KDE 3.5.9

Ilyen tanácsokat fölösleges írni! Kösz.

A formatText()-et alakítsd át úgy, hogy csak akkor végezze el a formázást, ha a kicserélendő rész-szöveg nem egyezik meg a kicserélő szöveggel.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Hát a QTextEditnek nincs ilyemi. Két workaround viszont van:
Nem szép, de formatTextbe csinálhatsz ilyet:

void QpjCheckTextEdit::formatText()
{
disconnect(this->document(), SIGNAL(contentsChanged()),
	        this, SLOT  (formatText()) );

		insertPlainText(" not OK ");

connect(this->document(), SIGNAL(contentsChanged()),
	        this, SLOT  (formatText()) );
}

A másik pedig, hogy elkapod a signal-t és eldöntöd kell-e. Szerintem az előbbi egyszerűbb.
Használhatnád a textChanged()-et is QTextEditből, csak úgy mondom.

Az anchor, ha a QTextEditben olvastad, akkor a másodlagos cursor, az anchor és a cursor közötti terület a kijelölt.

Az szerintem járható útnak tűnne, ha csak a font színét változtatom meg a programból. Szerintem akkor nem kellene, hogy contentsChanged() signal keletkezzen újra.
Nemdebár?

De... :) legalábbis úgy emlékszem, hogy a formátum változás is generálja a signal-t.

Igen.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Este kipróbálom a dii javaslatát.
Azért megvizsgálom a font színének megváltoztatásának hatását is.

Az anchor-t valóban a TextEdit-ben olvastam.
Így már világos, hogy mi is az.
Kösz dii!

Köszönöm Lajos észrevételét is a végtelen rekurzióval kapcsolatban. Jó megfigyelő!

f0xhu javaslata a körbehivatkozás elkerülésére is építő jellegű volt.

Remélem, tudok alkotni valamit, hogy működjön az elképzelésem. Ha nem jön össze, még jelentkezem.