Kleines Verständnisproblem mit vector <QString> und push_back
-
Hallo,
Worum es geht: ich lese eine Textdatei ein, in der Zeilenweise Befehle stehen, samt parameter.
Diese sollen nun Zeilenweise untersucht werden, um ggf. Befehle auszutauschen.Das folgende ist nicht ganz zusammenhängend, erklärt aber die Definition.
QString tokens = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; QString command = originalCommand; //used for splitting commands into component parts QVector<QString> items {}; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; index = command.indexOf("M"); if (index==0) { SuppressOutputFlag = true; } // ----- insert the required M3(pen_up) and M5(pen_down) code sequences index = command.indexOf("G"); if (index==0) { // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" items.push_back(subString.split(tokens)); //split string at each non-digit character gcode = items.at(0).toInt(); //item[0] contains the "match" value
Bei der vorletzten Zeile: items.push_back bekomme ich dann folgenden Fehler:
mainwindow.cpp:112: Fehler: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ ../GCodePostProcessor/mainwindow.cpp: In member function ‘void MainWindow::process(QTextStream&, QString)’: ../GCodePostProcessor/mainwindow.cpp:112:44: error: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ 112 | items.push_back(subString.split(tokens)); //split string at each non-digit character | ^
Irgendwie verstehe ich nicht, was da falsch läuft. Warum kann ich keinen QString in einen vector <QString> schreiben?
VG
Matze -
@MHage said in Kleines Verständnisproblem mit vector <QString> und push_back:
Warum kann ich keinen QString in einen vector <QString> schreiben?
Weil
subString.split(tokens)
einQStringList
und keinQString
gebt.error: no matching function for call to ‘QVector<QString>::push_back(QStringList)’
push_back(QString)
erlaubt ist, aber nichtpush_back(QStringList)
. -
Es würde möglicherweise mit
append()
anstattpush_back()
funktionieren. Das würde allerdings voraussetzen, dass QStringList in QVector<QString> konvertiert werden kann. Ansonsten bleibt nur, dass du QStringList direkt füritems
verwendest.Ich möche auch darauf hinweisen, dass
subString.split(tokens)
nicht das tut, was du denkst. Denn in dieser Variante vonsplit()
sucht es nach dem Substringtokens
, d.h. einem Substring mit dem vollständigen Alphabet inklusive der Kommas, und trennt an dieser Stelle auf. Es ist nicht so, dass an beliebigen Tokens aus dem langen Tokenstring gesplittet wird. Stattdessen müssen hier Regular Expressions verwendet werden. -
Mit dem Thema "subString.split(tokens)" bin ich auch noch nicht ganz durch. Du hast recht, es tut nicht wirklich das, was ich erwartet habe.
Im Moment sieht das bei mir so aus:
QString tokens = "A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z"; QString command = originalCommand; //used for splitting commands into component parts QStringList l; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" l = subString.split(QRegExp(tokens)); //split string at each non-digit character gcode = l.at(1).toInt(); //item[0] contains the "match" value
Das funktioniert zwar, aber nicht ganz so, wie ich es ursprünglich angedacht hatte...
-
Ein bisschen einfacher geht es mit
QString tokens = "[A-Z]";
.