Seite 1 von 1

Programm stürzt ab bei Slot-Aufruf in Slot

Verfasst: 9. Dezember 2009 20:17
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.

Verfasst: 9. Dezember 2009 20:24
von upsala
Was sagt denn dein Debugger dazu?

Verfasst: 9. Dezember 2009 20:37
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?

Verfasst: 10. Dezember 2009 08:20
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

Verfasst: 12. Dezember 2009 21:23
von Amgon
QSyntaxHighlighter sieht super aus, dankeschön. =)

Verfasst: 12. Dezember 2009 21:46
von phlox81
Kann es evtl. sein das du in refreshHTML wiederum ein textChanged Singal auslöst?

Verfasst: 12. Dezember 2009 21:51
von upsala
Zum einen hat er das bereits geschrieben und zum anderen ist der QSyntaxHighlighter sowieso die bessere Lösung.