Programm stürzt ab bei Slot-Aufruf in Slot

Verschiedenes zu Qt
Antworten
Amgon
Beiträge: 7
Registriert: 26. September 2009 20:00

Programm stürzt ab bei Slot-Aufruf in Slot

Beitrag von Amgon »

Hallo,

ich möchte zum Einstieg einen einfachen Editor schreiben. Dazu habe ich mir QTextEdit ausgesucht. Außerdem soll "abcd" unterstrichen dargestellt werden (das Prinzip vom Syntax-Highlighting eben).

Es gibt ein QMainWindow, das hat setCentralWidget(QTextEdit). Ich habe mir gedacht, sobald sich der Text des QTextEdit's veränder hat, lasse ich einen "Parser" drüber laufen, der daraus dann HTML erzeugt.

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    textEdit = new TextEdit();

    // sobald sich der Text ändert -> an refreshHtml() abgeben.
    connect(textEdit, SIGNAL(textChanged()),
            this, SLOT(refreshHtml()));

    setCentralWidget(textEdit);
}

Code: Alles auswählen

// private slots:
void MainWindow::refreshHtml()
{
    // Text holen und "parsen"
    QString tmp = textEdit->toHtml();
    tmp.replace(QRegExp("abcd"), "<u>abcd</u>");

    // Text in QTextEdit schreiben...
    textEdit->setHtml(tmp);
    // ...nur hier stürzt das Programm ab.
}
Mit Abstürzen meine ich ".exe funktioniert nicht mehr..." - es lässt sich also problemlos compilen.

Meine Vermutung ist, dass ich einen Slot nicht so einfach in einem anderen aufrufen kann. Oder was habe ich da falsch gemacht? Muss ich statdessen von refreshHtml nochmal ein Signal absenden, dass ich dann mit dem setHtml-Slot verbinde?

Das wäre schon relativ umständlich.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was sagt denn dein Debugger dazu?
Amgon
Beiträge: 7
Registriert: 26. September 2009 20:00

Beitrag von Amgon »

Ehrlichgesagt weiß ich nicht, wie mir der Debugger weiterhelfen soll. ;)

Duch den habe ich den Fehler jetzt auf die oben markierte Zeile eingrenzen können, und sehe, dass QString tmp den richtigen HTML-Code (mit DOCTYPE, Header und allem) enthält.

Nach dem Absturz steht dann da: Stopped: "signal-received" und es bewegt sich nichts mehr.

// edit: Aaah, mir ist ein Licht aufgegangen. :D Endlos-Rekursion, wenn ich setHtml() verwende, wird ja textChanged() ausgelöst usw.

Theoretisch könnte ich überprüfen, ob sich nach dem Parsen etwas am Text geändert hat:

Code: Alles auswählen

if(textEdit->toHtml() != tmp) {
    textEdit->setHtml(tmp);
}
Mein Problem ist jetzt nur, dass sobald "abcd" mal vorhanden ist, immer wieder ein neues <u>...</u> gesetzt wird. Nach dem zweiten Durchlauf habe ich dann <u><u>abcd</u></u> usw.

Gibt es eine Möglichkeit aus einem QTextEdit nur den Text ohne HTML-Tags zu bekommen? Oder muss man da radikal alles zwischen < und > weghauen?
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

Amgon hat geschrieben:Ehrlichgesagt weiß ich nicht, wie mir der Debugger weiterhelfen soll. ;)
Er könnte dir zum Beispiel zeigen, wo dein Problem liegt (indem er dir bspw. deine Endlosschleife zeigt) ;-)
Theoretisch könnte ich überprüfen, ob sich nach dem Parsen etwas am Text geändert hat:
Und praktisch könntest du dir QSyntaxHighlighter anschauen.


Gibt es eine Möglichkeit aus einem QTextEdit nur den Text ohne HTML-Tags zu bekommen? Oder muss man da radikal alles zwischen < und > weghauen?
QTextEdit::toPlainText();

\Ralf
Amgon
Beiträge: 7
Registriert: 26. September 2009 20:00

Beitrag von Amgon »

QSyntaxHighlighter sieht super aus, dankeschön. =)
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag von phlox81 »

Kann es evtl. sein das du in refreshHTML wiederum ein textChanged Singal auslöst?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Zum einen hat er das bereits geschrieben und zum anderen ist der QSyntaxHighlighter sowieso die bessere Lösung.
Antworten