PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt: QString global?



chapaev
05-03-2005, 14:14
Hi Leute,

Ich bin's wieder. :rolleyes:

Ich habe mit QT-Designer eine form erstellt. Als header habe ich *.ui.h genommen.
Ich brauche eine Funktion, die einen String erstellt und zwar jedes mal ein neuen.
Wie ich festgestellt habe klappt das shon mal nicht:

void myApp::createStr(const QString strName, const QString strInhalt)
{
QString* strName = new QString(strInhalt);
}
Wie kann man das machen?

MfG

chapaev

peschmae
05-03-2005, 15:19
*Was* geht denn da nicht? Ein bisschen wenig Code. Das sollte noch funktionieren soweit.

MfG Peschmä

anda_skoa
05-03-2005, 15:47
Besser du sagst was du erreichen willst :)

Ciao,
_

chapaev
05-03-2005, 17:40
*Was* geht denn da nicht? Ein bisschen wenig Code. Das sollte noch funktionieren soweit.
Wenn ich das wüsste :D

Hier ist der Fahler:

g++ -c -pipe -Wall -W -O2 -march=athlon-xp -pipe -DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -Itmp/ -o tmp/qcreatevob.o qcreatevob.cpp
In file included from qcreatevob.cpp:38:
qcreatevob.ui.h: In member function `virtual void
qcreatevob::createStr(QString, const QString&)':
qcreatevob.ui.h:745: error: declaration of `strName' shadows a parameter
qcreatevob.ui.h:745: warning: unused variable `QString*strName'
qcreatevob.ui.h:744: warning: unused parameter `QString strName'
make: *** [tmp/qcreatevob.o] Error1 1

Besser du sagst was du erreichen willst
Ich will dass ein String "declariert" wird und zwar jedes mal wenn ich es will, so das ich ihn dann aus einem anderen slot abrufen kann.

MfG

chapaev

peschmae
05-03-2005, 19:09
Achso, ja da hats halt noch einen Parameter der Funktion der genau gleich heisst wie der lokale QString-Pointer den du dort deklarierst.
Das gibt offenbar einen Error (wenn ich der Compiler wär gäbs nur ne Big Fat Warning, aber der bin ich nicht und vielleicht stehts ja auch so im Standard...)

Könntest du noch etwas ausführlicher werden in Bezug auf was du willst? Das hab ich noch nicht ganz verstanden.

MfG Peschmä

anda_skoa
05-03-2005, 20:31
Ich will dass ein String "declariert" wird und zwar jedes mal wenn ich es will, so das ich ihn dann aus einem anderen slot abrufen kann.


Wenn du einen String zwischen zwei Methoden Aufrufen behalten willst, brauchst du ihn ja nur als Variable (Member) der Klasse zu deklarieren.

Für Leute wie dich, die aus unerfindlichen Gründen den ui.h Hack benutzen, gibt es dafür sicher eine Möglichkeit irgendwo im Object Browser des Designer.

Ciao,
_

chapaev
05-03-2005, 20:48
Könntest du noch etwas ausführlicher werden in Bezug auf was du willst? Das hab ich noch nicht ganz verstanden.
Ich kann es versuchen! :)

Also es ist folgendes....
Ich habe in mein Programm ein QListBox eingebaut. Dazu noch ein Button "Add"(Name spricht für sich). Eine LineEdit mit Dateinamen (verändert sich logischerweise) und ein paar Einstellungen die gespeichert werden müssen (als string). Also ich will dass dateiname ins QListBox kommt (habe ich gemacht) und wenn man auf ein item doppelklickt bekommt man Eintellungen zu sehen (als text). Um diese Einstellungen zu speichern wollte ich das ein String erstellt wird, mit einem Namen "string + Nr". Nummer wird dann identish sein mit dem Nummer des Items. Das Problem ist wenn ich ein string erstelle ist er nur für einen slot aktiv aus einem anderen slot kann man diesen string dann ncht mehr lesen (kommt error string1 ist nicht declariert). In zwischen versuche ich diesen Efect mit QStringList zu erzeugen. Aber zu wiessen wie das mit dem String geht währe trotzdem gut.

MfG

chapaev

anda_skoa
06-03-2005, 11:01
Wenn du pro Eintrag in der ListBox zustäzliche Daten hast, ist ein einzelner String ohnehin keine geeignete Datenstruktur, da brauchst du auf jeden Fall eine Datenstruktur die mehrere Elemente aufnehmen kann, also zum Beispiel eine Liste.

Da du die Struktur nur zwischen Methoden der selben Klasse brauchst, reicht eine normale Membervariable.

Ciao,
_

chapaev
06-03-2005, 14:22
Da du die Struktur nur zwischen Methoden der selben Klasse brauchst, reicht eine normale Membervariable.
Leider habe ich kein Ahnung wie man die erstellt. :( Ich habe es mit QStringList gemacht, hat aber der Nachteil, dass ein String in der liste Name des Items beinhalten soll am sonsten wird er nciht erkannt.
Ich habe nicht gefunden wie man eine bestimmte Zeile (int) aus den QStringlist auslesen kann , deshalb habe ich es nach inhalt gemacht:


void myApp::readScriptFromList()
{
QString filtred = "^(.*)" + scriptList->currentText() + "(.*)$"; //scriptList = QListBox
QString currentScript = scripts.grep(scriptList->currentText()).join("");
myScript = new scriptedit(this); // scriptedit = Dialog
myScript -> main(currentScript);
if( myScript->exec() )
{
QString tmp = myScript->becomeStr();
if( tmp.find(scriptList->currentText()) == -1 )
{
tmp.insert(0, getScriptBegin(inputFile, outFileLine->text())); // wenn scriptList->currentText() aus irgend einem Grund aus der liste entfernt wird wird er beim speichern wieder erstellt
}
scripts.gres(QRegExp(filtred), tmp);
}
}
Aber ich denke man kann es auch einfacher machen.
anda_skoa kannst du mir vielleicht ein Beispiel posten wie das geht? Bzw. wenn es irgend wo beschrieben wird ein link. Ich wehre dir sehr dankbar daführ.

MfG

chapaev

anda_skoa
06-03-2005, 14:41
Leider habe ich kein Ahnung wie man die erstellt. :( Ich habe es mit QStringList gemacht, hat aber der Nachteil, dass ein String in der liste Name des Items beinhalten soll am sonsten wird er nciht erkannt.
Ich habe nicht gefunden wie man eine bestimmte Zeile (int) aus den QStringlist auslesen kann , deshalb habe ich es nach inhalt gemacht:

Dafür hat QStringList einen Index Operator :)
http://doc.trolltech.com/3.3/qvaluelist.html#operator%5B%5D-2



Aber ich denke man kann es auch einfacher machen.
anda_skoa kannst du mir vielleicht ein Beispiel posten wie das geht? Bzw. wenn es irgend wo beschrieben wird ein link. Ich wehre dir sehr dankbar daführ.

Dazu müssten wir wissen, welche Daten du pro Item haben willst.
Aber im wesentlichen machst du einfach eine struct oder class mit den entsprechenden Elementen, ein QValueList von diesem Typ in deiner Klasse und dann beim Einfügen in die ListBox einfach ein entsprechendes Element an die ValueList anhängen.
Oder einen QPtrList wenn die Elemente nicht leicht kopiert werden können.

Oder einen C++ STL Standardcontainer, falls du dich damit besser auskennst.

Ciao,
_