Seite 1 von 2
Probleme bei QString::toStdString
Verfasst: 16. September 2009 10:19
von JoseMan
Hallo nochmal liebe Community.
Habe noch ein Problem. Irgendwas stimmt nicht bei mir. Folgender Code:
Code: Alles auswählen
QStringList strList = QFileDialog::getOpenFileNames(this, tr("Select a input file."), QString("D:"), tr("Files (*.*)"));
QString test(strList.at(0));
std::string test2(test.toStdString()); // hier kommt nix raus, oder nur unsinn!
So, ich hoffe der Code ist selbsterklärend.
Meine "test2"-Variable beinhaltet nur Mist!
Ich muss es aber so machen, da mein weiterer Programmfluss das benötigt.
Vorher, ich habe gegen Qt statisch gelinkt, mit "QtCore.lib" und "QtGui.lib", ging es noch schön!
Jetzt, ich linke Qt dynamisch, und verwende die "QtCore4.lib" und "QtGui4.lib", funktioniert das nicht mehr richtig.
Hat jemand eine Ahnung woran das liegen könnte?
Hat jemand eine Idee wie ich das beheben könnte?
Thx + Ciao
[Edit]
Ich verwende Unicode Zeichensatz.
[/Edit]
Verfasst: 16. September 2009 10:24
von AuE
Mhhh was mit toStdWString()?
BTW der Code ist gefährlich.... Was ist wenn keine Datei ausgewählt wurde bzw Abbrechen gedrückt wurde
Und warum net getopenFilename wenn du eh nur auf einen Eintrag zugreifst?
Verfasst: 16. September 2009 10:26
von JoseMan
AuE hat geschrieben:Mhhh was mit toStdWString()?
Kommt folgender Fehler:
VS2005 hat geschrieben:
Fehler 1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::allocator<_Ty> &)': Konvertierung des Parameters 1 von 'QStdWString' in 'const std::allocator<_Ty> &' nicht möglich d:\JochensProjects\trunk\PlanarView\PlanarViewQt\PlanarView\ImportDialog.cpp 68
Verfasst: 16. September 2009 10:31
von AuE
Code: Alles auswählen
QString x = QFileDialog::getOpenFileName(this, "Choose");
std::string stdX = std::string(x.toStdString() );
qDebug() << "String original:" << x << "as std::string:"<<stdX.c_str();
liefert:
String original: "/home/myname/asdasdasd/moc_mainwindow.o" as std::string: /home/myname/asdasdasd/moc_mainwindow.o
Verfasst: 16. September 2009 10:39
von JoseMan
AuE hat geschrieben:Code: Alles auswählen
QString x = QFileDialog::getOpenFileName(this, "Choose");
std::string stdX = std::string(x.toStdString() );
qDebug() << "String original:" << x << "as std::string:"<<stdX.c_str();
.....
Da kommt ein schwerer Fehler.
Ich habe die Fehlerausgabe mal an den Post gehängt!
Verfasst: 16. September 2009 10:42
von AuE
wo genau raucht er ab?
Verfasst: 16. September 2009 10:48
von JoseMan
AuE hat geschrieben:wo genau raucht er ab?
Code: Alles auswählen
QString test(strList.at(ii));
std::string test2= std::string(test.toStdString()); // <-- hier... (???)
Verfasst: 16. September 2009 10:52
von Christian81
Es gibt 2 Möglichkeiten
1. Der zurückgegebene String ist leer (also keine Datei ausgewählt)
2. Das Projekt wurde nicht mit qmake erzeugt und deshalb ist /Zc:wchar_t aktiv, Qt wird aber defaultmässig ohne diesen Schalter gebaut (jetzt mal wieder mein Kommentar - wenn man es schon von Hand machen muss sollte man auch wissen was man tut)
Des weiteren - warum überhaupt std::string? Sobald ein Sonderzeichen drin ist ist der string pfutsch (wstring würde gehen, aber auch hier - für was wenn nicht gerade eine andere Library ein (w)string benötigt)
Verfasst: 16. September 2009 11:00
von JoseMan
Christian81 hat geschrieben:Es gibt 2 Möglichkeiten
1. Der zurückgegebene String ist leer (also keine Datei ausgewählt)
2. Das Projekt wurde nicht mit qmake erzeugt und deshalb ist /Zc:wchar_t aktiv, Qt wird aber defaultmässig ohne diesen Schalter gebaut (jetzt mal wieder mein Kommentar - wenn man es schon von Hand machen muss sollte man auch wissen was man tut)
Des weiteren - warum überhaupt std::string? Sobald ein Sonderzeichen drin ist ist der string pfutsch (wstring würde gehen, aber auch hier - für was wenn nicht gerade eine andere Library ein (w)string benötigt)
Also gut. Der zurückgegebene String ist nicht leer! Das ist sicher.
nachdem ich Qt installiert/erstellt habe, konnte ich in meinem VS-Studio einfach sagen: "neues Qt-Projekt" und fertig.
Und wenn ich wstring benutze, dann kommt folgender Link-Fehler:
Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __thiscall QString::toStdWString(void)const " (__imp_?toStdWString@QString@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@XZ)" in Funktion ""private: void __thiscall ImportDialog::openInputfile(void)" (?openInputfile@ImportDialog@@AAEXXZ)". ImportDialog.obj
Wie kann ich denn nun im nachhinein diese Schalter für Qt einstellen?
Verfasst: 16. September 2009 11:06
von Christian81
Ich würde sagen - in den Eigenschaften des Projektes/der Bibliothek... benutzt Du die IDE oder ich?
Verfasst: 16. September 2009 11:15
von JoseMan
Christian81 hat geschrieben:Ich würde sagen - in den Eigenschaften des Projektes/der Bibliothek... benutzt Du die IDE oder ich?
Ich kann nicht viel in Qt-Projekteinstellung über die IDE regeln.
Siehe Anhang.
Hilfreich wäre wenn ich mal von Dir, wenn Du schon weist was der Fehler ist, konkrete Lösungsvorschläge bekommen würde. Um ehrlich zu sein, kann ich mit deinen Doppeldeutigen/Ironischen Antworten nicht wirklich viel anfangen.
Ich weis nicht wie das hier läuft, aber in den Foren in den ich so bin, da wird meist auf Fragen/Hilfegesuche produktiv reagiert, außer es hat keinen Sinn. Aber ist das bei mir der Fall?
Verfasst: 16. September 2009 11:17
von Christian81
Lösungsvorschlag: 'google.de -> /Zc:wchar_t, ersten Link anklicken und Lesen'
Ist das zu viel verlangt?
Verfasst: 16. September 2009 11:33
von JoseMan
So, ich habe jetzt diese Eigenschaft von "wchar_t als built-in Typ behandeln." auf "Ja" gesetzt, aber ohne Veränderung!
D.h. er SCHMIERT IMMER NOCH AB!!!!!
Verfasst: 16. September 2009 12:08
von Christian81
Funktioniert ein
Code: Alles auswählen
QByteArray tmp = test.toLocal8Bit();
std::string test2 = std::string(tmp.constData())
?
Wenn ja liegts an der besagten Option.
Verfasst: 16. September 2009 12:21
von JoseMan
Jupp, das funktioniert.
Ich habe es jetzt auch erstmal über ein QString::toAscii(), und dann von einem QByteArray mit QByteArray::data() gemacht. Fuktioniert auch, muss aber die ganzen Codestellen umschreiben. Und es wird halt nur 8-Bit Zeichensätze verwendet!!
Es liegt also an der besagten Option.... (wchat_t..). das habe ich doch schon an.
Sorry, aber verstehe ich das nicht!!!