Document mit QSyntaxHighlighter als Plaintext

Alles rund um die Programmierung mit Qt
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Moin,

ich habe ein tabWidgets mit Tabs, die ich dynamisch erstelle. Ich habe mir für die Tabs eine eigene Klasse erstellt, die von QWidget erbt. Momentan tut sie auch nicht viel mehr, als noch einen Pointer auf einen QTextEdit zu besitzen. Auf dieses QTextEdit wird ein QSyntaxHighlighter angewendet.

Ich möchte nun den Inhalt des QTextEdit als Plaintext in Form eines normalen std::string. Dafür gibt es eig. auch die entsprechende Funktion, die aber zu merkwürdigen Ergebnissen führt.

Code: Alles auswählen

void MyClass::init()
{
TabWidget* newTab = new TabWidget(ui.tabWidget);
MyHighlighter* tabHighlighter = new MyHighlighter(tabTextEdit->document());
//...
ui.tabWidget->addTab(newTab,"Neuer Tab");
}
void MyClass::doSomething()
{
TabWidget* tab = dynamic_cast<TabWidget*>(ui.tabWidget->currentWidget());
tab->getEdit()->document()->setPlainText(tab->getEdit()->document()->toPlainText()+QString("blubb"));
logFile<<tab->getEdit()->document()->toPlainText().toStdString();//.c_str(); //Führt zum Absturz!
}
Wenn ich nun meine Funktion doSomething() aufrufe, führt die dritte Zeile (also die Ausgabe an das Log-File) zum Absturz, mit einer sehr merkwürdigen Ausgabe:
void test;blubb —}J ÏB ·Ö ´ÎB §\ ! ÷B ,ÏB Ïg ! TÏB +êg÷B ! TÏB Æù~J¨c HçèpçgHçè ÷B :i ƒG :i Ørc ÜÎB ¨ÏB xýg (6e ÎÅ eHçèü0u`;f TÏB d7e Hçè `ÏB i"4e où~J(6e ÐÚèHçèúÿÿÿ(6e d7e d7e [ ÐB aGSeÿÿÿÿq}4eÐB p?Se ß4eàÏB Hçè Ëù~JHçè(6e (6e 0ÕB ¸Ì (6e Â4eî4e ÐÚè(6e (6e 0ÕB (ÑB áFSe 3Ž4eHçè 0ÕB 0ÕB ÐÚèû&e0ÕB ?æ~JÐÚè(6e 0ÕB #J ¹ å ¸ÐB $³ ¹ „ Xa „ è/ H a `a m @a 0ÐB œÑB ÕqÈw{× þÿÿÿŒãÃwòàÃw¼É FàÃw å àÐB bìu0óuå ÑB 4kìu kìu…ç~J å „ ìÐB ÐÚèÔB ¦òu‘]Ð? ˆ ÑB ÆPeÿÿÿÿ\4e0ÕB Gç~J0ÕB ÐÚèÔÓB xsG ÐÚèÖÃg ÐÚèèxG ¡êG ÐÚè´ÓB R«ReÿÿÿÿÆ
gÐÚè0ÕB 0ÕB 0ÕB ´ÓB *GSeÿÿÿÿ9Öe0ÕB ÐÚèHÕB 0ÕB …òeÐÚè0ÕB Çç~JÐÚèp÷B ƒG ê Æ xsG p÷B ÐÚè G & HÕB ô * ´ÑB 0h ,ÒB Ü ¤ÑUe 6e & å ¨Ü œÒB <t G :<tkä~J„G ¨Ü …G È=i Ÿf …G ^ÏtdÒB pÒB ÓB ^ÏtWã9>þÿÿÿ:<tð×g¨Ü ŒãÃwŒãÃwŽVw¼É œG G ÐÚè%G $³ ¹ ¨Ü £4e&­ %G ¹ H×B Xa Xa è/ H a `a 0j @a ¬ÒB °ÒB ÔB ÔB ÕqÈw{× þÿÿÿŒãÃwòàÃw¼É FàÃw øl hÓB #àÃw à‡e ÔB G m ÈÓB <tkç~Júbìuˆ „ ÄÓB ÈÓB ¸=t G ÔB /ÀOe p÷B ÚèÔB ÔB H,gÔB
Æ
(gekürzt)

Wenn ich den String als const char* konvertiere, gibt es gar keine Ausgabe. Interessant ist Folgendes:
Kommentiere ich die dritte Zeile aus, gibt es keinen Absturz und an den Ausgangsstring wird "blubb" angehängt in dem Edit.
Deswegen müssen sowohl der Cast, als auch sonstige Pointer richtig sein. Ebenso wird der korrekte QString herausgelesen, jedoch entsteht bei der Konvertierung in einen std::string nichts sinnvolles.

Da ich kein Qt-Profi bin, würde ich mich über Ratschläge freuen. Meine Vermutung ist, dass dadurch das ich einen QSyntaxHighlighter verwende, die Konvertierung toStdString() nicht funktioniert.

Gruß mark
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von brax »

Das mit SyntaxHighlighter kannst Du ausschließen, im Prinzip mache ich das gleiche ohne Probleme trotz SyntaxHighlighters. Ich benutze zwar ein QPlainTextEdit für sowas in der Art, aber das sollte keinen Unterschied machen.

Ich bin mir nicht sicher, aber ich nehme an, dass es mit dem Gültigkeitsbereich der temporären Objekte, die dort zurückgegeben werden zusammen hängt.

Versuch mal, Dir den QString, den toPlainText zurückliefert vorher in eine Variable zwischenzuspeichern, also etwa:

Code: Alles auswählen

void MyClass::init()
{
TabWidget* newTab = new TabWidget(ui.tabWidget);
MyHighlighter* tabHighlighter = new MyHighlighter(tabTextEdit->document());
//...
ui.tabWidget->addTab(newTab,"Neuer Tab");
}
void MyClass::doSomething()
{
TabWidget* tab = dynamic_cast<TabWidget*>(ui.tabWidget->currentWidget());
tab->getEdit()->document()->setPlainText(tab->getEdit()->document()->toPlainText()+QString("blubb"));
QString text = tab->getEdit()->document()->toPlainText();
logFile<<text.toStdString();//.c_str(); //Führt zum Absturz!
}
Abgesehen davon, dass Du damit das Problem umgehst, dass es schwer ist zu durchschauen, wann der QString, den toPlainText zurückgibt, abgeräumt wird, wird der Code dadurch lesbarer, finde ich.
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Hallo brax,

ich habe es getestet, es passiert genau das gleiche. Er stürzt ab und schreibt in die txt merkwürdige Dinge. Falls es wem hilft, ab und an stehen da auch mal DLL-Namen oder Pfade zu vers. Dateien drin (bspw. Release-Pfad, Manifestdatei-Pfad u.v.m.). Wenn ich text jedoch wieder in das Editfeld schreibe kommt das richtige raus.

Auf die Lesbarkeit des Codes habe ich noch nicht viel geachtet, wollte es erstmal lauffähig kriegen, aber gebe dir vollkommen recht :).

Gruß Mark
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von Christian81 »

Dann bitte ein minimales Beispiel.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Beziehst du dich auf die Log-Ausgabe?
Actx | 4 ü $ ‘{Ê8 $ ` Ö Œ ü < 8 $ \ ( „ ( ¬ ( Ô ( ü SsHd, ø , Ê Ê  8 C : \ U s e r s \ M a r k \ D o c u m e n t s \ V i s u a l S t u d i o 2 0 1 0 \ P r o j e c t s \ test\ b i n \ r e l e a s e \ ( ‘{Ê< $ d Ö l ¦ ” C : \ U s e r s \ M a r k \ D o c u m e n t s \ V i s u a l S t u d i o 2 0 1 0 \ P r o j e c t s \ test \ b i n \ r e l e a s e \ test . e x e M i c r o s o f t . V C 9 0 . C R T l ì Ð â ¼
¿»ë-,Ì ˜   M i c r o s o f t . V C 9 0 . C R T , p r o c e s s o r A r c h i t e c t u r e = " x 8 6 " , p u b l i c K e y T o k e n = " 1 f c 8 b 3 b 9 a 1 e 1 8 e 3 b " , t y p e = " w i n 3 2 " , v e r s i o n = " 9 . 0 . 3 0 7 2 9 . 6 1 6 1 " C : \ W i n d o w s \ W i n S x S \ m a n i f e s t s \ x 8 6 _ m i c r o s o f t . v c 9 0 . c r t _ 1 f c 8 b 3 b 9 a 1 e 1 8 e 3 b _ 9 . 0 . 3 0 7 2 9 . 6 1 6 1 _ n o n e _ 5 0 9 3 4 f 2 e b c b 7 e b 5 7 . m a n i f e s t x 8 6 _ m i c r o s o f t . v c 9 0 . c r t _ 1 f c 8 b 3 b 9 a 1 e 1 8 e 3 b _ 9 . 0 . 3 0 7 2 9 . 6 1 6 1 _ n o n e _ 5 0 9 3 4 f 2 e b c b 7 e b 5 7 SsHd, , ø ¬³S·t Œ ªÖý
  ¸ '}ˆÌ ä m s v c r 9 0 . d l l m s v c p 9 0 . d l l m s v c m 9 0 . d l l , D \ GsHd( GsHd( GsHd( GsHd(
(leserliche Auszug)

Wenn du etwas anderes möchtest, bitte Bescheid sagen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von Christian81 »

Ein minimales compilierbares Beispielprogramm welches dein Problem aufzeigt. Schätze dass dazu nicht mehr als 30 Zeilen Code nötig sind aber die wollen wir von Dir.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Moin,

ich habe mal die UI als Header dran gehängt. Der Rest ist hier:

Code: Alles auswählen

//testproj.h
#ifndef TESTPROJ_H
#define TESTPROJ_H

#include <QtGui/QMainWindow>
#include "ui_testproj.h"

class TestProj : public QMainWindow
{
	Q_OBJECT

public:
	TestProj(QWidget *parent = 0, Qt::WFlags flags = 0);

private:
	Ui::TestProjClass ui;
public slots:
	void doSomething();
};

#endif // TESTPROJ_H

Code: Alles auswählen

//testproj.cpp
#include "testproj.h"
#include "TabWidget.h"

#include <fstream>

TestProj::TestProj(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	connect(ui.actionAdd,SIGNAL(triggered()),this,SLOT(doSomething()));

	TabWidget* newTab = new TabWidget(ui.tabWidget);
	QVBoxLayout* tabLayout = new QVBoxLayout(newTab);
	QTextEdit* tabTextEdit = new QTextEdit(newTab);
	newTab->setEdit(tabTextEdit);

	tabLayout->addWidget(tabTextEdit);
	newTab->setLayout(tabLayout);

	ui.tabWidget->addTab(newTab,"Neues Tab");
	ui.tabWidget->setCurrentWidget(newTab);
}
void TestProj::doSomething()
{
	std::ofstream file;
	file.open("testproj.txt",std::ios::trunc);
	TabWidget* tab = dynamic_cast<TabWidget*>(ui.tabWidget->currentWidget());
	QString text =  tab->getEdit()->document()->toPlainText();
	tab->getEdit()->document()->setPlainText(text+QString("blubb"));
	file<<text.toStdString();//.c_str();
	file.close();
}

Code: Alles auswählen

//TabWidget.h
#ifndef TABWIDGET_H
#define TABWIDGET_H
#include "qwidget.h"
#include "qtextedit.h"

class TabWidget : public QWidget
{
public:
	TabWidget(QWidget *parent = 0)
		:QWidget(parent),
		tabEditPtr(0)
	{
	}
	inline void setEdit(QTextEdit* ptr) { tabEditPtr = ptr;}
	inline QTextEdit* getEdit() { return tabEditPtr; }
private:
	QTextEdit* tabEditPtr;
};

#endif
ui_testproj.h
UI Header
(3.49 KiB) 184-mal heruntergeladen
Ich hoffe damit könnt ihr was anfangen. Wie gesagt, wenn ihr:
file<<text.toStdString();//.c_str();
ausklammert, dann stürzt er nicht ab und der string wird korrekt gesetzt. Hoffe der Umfang ist ok.

Gruß Mark
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von brax »

Etwas liebevoller hätte es schon sein können (pro file wäre toll und ne main wäre auch nicht schlecht). Ich hab mir mal erlaubt, das zu vervollständigen, falls jemand anderes sich das mal angucken möchte (siehe Anhang).

Also bei mir kommt die "testproj.txt" mit folgendem Inhalt raus:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et neque augue, a ullamcorper dolor.
Was interessanter Weise natürlich genau das ist, was ich ins Textedit geschrieben habe. Ich hab allerdings einen Absturz, wenn das TextEdit nicht das aktive Tab ist, aber das ist ja ein anderes Problem...

Wenn ich das .c_str() rein mache passiert auch nichts schlimmes....
Dateianhänge
testproj.zip
(3.03 KiB) 173-mal heruntergeladen
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Ich arbeite nicht mit QtCreator sondern mit VS2010. Die main.cpp ist dachte ich klar.

Dein Ergebnis erstaunt mich aber doch. Mein Code ist exakt gleich.

Habe es mal als executable hoch geladen.

http://www.sendspace.com/file/0mtchz


Gruß Mark
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von brax »

Ich arbeite auch mit dem VS und qmake erzeugt ganz wunderbare Projektfiles dafür.

Und ja, natürlich ist die main.cpp klar, aber wenn man Hilfe möchte, finde ich, dass man es den potentiellen Helfern so einfach wie möglich machen sollte.

Hast Du mal probiert aus meiner Version mit qmake ein VS Projekt zu erzeugen und dann mal geguckt? Da Du ja nicht mit pro Files arbeitest (wie machst Du das mit Custom build steps für den moc? Alles per Hand?) hier die nötige Kommandozeile:
qmake -r -tp vc
Natürlich in dem Verzeichnis, wo Du das zip hin extrahiert hast und in einem VS-Commandprompt, damit qmake den Compiler findet.

Welche Qt Version benutzt Du?
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Ich arbeite mit dem Qt Plugin (der moc't alles automatisch) und der Qt Version 4.7.1 . Das nächste mal werde ich alles hochladen, versprochen :).

Ich habe dein Projekt mal nach VS konvertiert mit qmake. Dann erstellt, geht alles ohne Probleme.
Aber es tritt genau der gleiche Bug auf. Das Program stürzt ab und die TxT wird mit 121KB zugemüllt und dazwischen hängen halt mal an und i-welche Systemvariablen + Pfade.
Aber das ändert sich bei jedem Absturz.

Gruß Mark
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von brax »

Ok verstehe. Das Qt Plugin hab ich rausgeschmissen, weil es den Debugger so fürchterlich langsam macht (jedenfalls wenn die Solution entsprechend groß ist).

Keine Ahnung, warum es bei Dir nicht so läuft wie bei mir. Ich benutze allerdings andere Versionen (Qt 4.6.3 und VS2008), weil unsere Firma eben nicht so schnell ist ;)

Ich hab gerade nochmal mit 4.7.4 getestet, aber da hab ich das gleiche Ergebnis (also keine Probleme). Daher weiß ich nu nicht so recht, wie ich Dir weiterhelfen kann, sorry.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von Christian81 »

QString, std::string und msvc? Dann ists sicher ein Problem mit Debug und Release MSVC Runtime... also bitte überprüfen ob auch immer die richtigen Libs benutzt werden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von mark93 »

Trotzdem vielen Dank @brax, wenn dir noch was einfällt, raus damit :).

Ich verwende nur die GUI und CORE-Lib:
c:\Qt\4.7.1\lib\QtGui4.lib
c:\Qt\4.7.1\lib\QtCore4.lib

Die Debug-Libs haben ja noch ein Postfix 'd' dran. Compile-Einstellungen sind auch auf Release.

Muss ich sonst noch etwas überprüfen?
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Document mit QSyntaxHighlighter als Plaintext

Beitrag von brax »

Also ich hab es jetzt zu Hause nochmal mit VS2010 und Qt 4.7 probiert (sowohl debug als auch release) und kann Deine Probleme auch nicht nachvollziehen. Es hätte mich zwar gewundert, wenn es wirklich mit VS2010 zusammengehangen hätte, aber testen wollte ich es doch nochmal.
Antworten