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

Fórumok

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ások

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

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

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.

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.

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.