Преобразование const char* в QString

Мне нужно использовать вывод функции типа const char*, и мне нужно преобразовать его в QString.

Примечание: внутри этой функции есть строки кода для возврата const char*

char* ClassA::getData() const{
    return const_cast<char *> (_foo.c_str());
}

где _foo равно std::string.

Я пытался использовать следующие строки кода, но всегда получал пустую строку (на самом деле не пустую, а содержал только символы новой строки и пренебрегал всеми остальными символами).

QString foo1 = QString(temp.getData());
QString foo2 = QString::fromLocal8Bit(temp.getData());
QString foo3 = QString(QLatin1String(temp.getData()));
QString foo4 = QString::fromAscii(temp.getData());
QString foo5 = QString::fromUtf8(temp.getData());

person Mahmoud Hassan    schedule 29.12.2013    source источник
comment
Показать больше кода. Этого недостаточно, чтобы помочь. QString foo5 = QString::fromUtf8(temp.getData()); должно работать.   -  person lpapp    schedule 29.12.2013
comment
QString принимает const char *. Не нужно изо всех сил притворяться, что это не постоянные данные.   -  person chris    schedule 29.12.2013
comment
@LaszloPapp странно, что все эти версии получили одну и ту же пустую строку. Я думаю проблема в const_cast<char *> функции, которую я вызываю. но у меня нет разрешения редактировать эту функцию, чтобы она возвращала std:string или обычный char *   -  person Mahmoud Hassan    schedule 29.12.2013
comment
В таких случаях я сохраняю вывод функции (результат getData()) в переменную и проверяю с помощью отладчика, действительно ли функция возвращает допустимую строку. Затем продолжите преобразование в QString. Он должен быть преобразован, так как QString имеет подходящий конструктор (qt-project .org/doc/qt-4.8/qstring.html#QString-8). Как сказал Крис, попробуйте без кастинга, просто с const char*.   -  person Sceptical Jule    schedule 29.12.2013
comment
Я начинаю думать, что _foo неправильно установлен в коде. Я не мог объяснить это иначе. :-)   -  person lpapp    schedule 29.12.2013
comment
Брось это const_cast! Немедленно!   -  person Lightness Races in Orbit    schedule 29.12.2013
comment
@LightnessRacesinOrbit Я не могу изменить реализацию ClassA.   -  person Mahmoud Hassan    schedule 29.12.2013
comment
@MahmoudHassan: если вы используете C++11, тогда верните &_foo.front(). Функционально то же самое, но не вызывает удивления.   -  person Lightness Races in Orbit    schedule 29.12.2013


Ответы (1)


Код ниже должен работать нормально. Ваша проблема, скорее всего, где-то в другом месте. Пожалуйста, сделайте чистую сборку.

Ошибка будет где-то еще в вашем более сложном коде, которым вы не поделились с нами. Вероятно, у вас возникают проблемы с неправильной настройкой _foo.

Как вы сами заметили, вы не можете изменить интерфейс, но лучше принять к сведению, что в идеальном мире вы не будете смешивать стандартные строки с QString. Вы бы просто использовали QString в своем коде.

Даже если вам по какой-то причине нужно использовать типы std или raw char*, лучше не делать в коде такое приведение типа const, так как QString справится с переданными ему константными строками.

main.cpp

#include <QString>
#include <QDebug>

class ClassA
{
    public:
        ClassA() { _foo = "Hello World!\n"; }
        ~ClassA() {}

        char* getData() const {
            return const_cast<char *> (_foo.c_str());
        }

    private:
        std::string _foo;
};

int main()
{
    ClassA temp;
    QString myString = QString::fromUtf8(temp.getData());
    qDebug() << "TEST:" << myString;
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

Вывод

TEST: "Hello World!
"
person lpapp    schedule 29.12.2013
comment
в getData() попробуйте вернуть так же, как и в вопросе: return const_cast<char *> (_foo.c_str()); - person Mahmoud Hassan; 29.12.2013
comment
@MahmoudHassan: я так и сделал, работает нормально; см. ответ. - person lpapp; 29.12.2013
comment
@MahmoudHassan: я даже прогнал его через qt 4 и 5 с qmake -r && make && ./main. - person lpapp; 29.12.2013
comment
@MahmoudHassan: какой тип и версию компилятора вы используете? - person lpapp; 29.12.2013
comment
Я знаю, что это должно сработать. На самом деле я могу написать что-то вроде cerr << temp.getData(); и напечатать строку в терминале, но qDebug() << QString::fromUtf8(temp.getData()); напечатать только пустые строки. Я использую QT 4.8 и собираю с помощью gmake. - person Mahmoud Hassan; 29.12.2013
comment
@МахмудХассан: gmake? Какая у вас операционная система? Можете ли вы также ответить на мой вопрос о компиляторе? Итак, ваша проблема, вероятно, не в преобразовании, а в qDebug()? Вы пробовали QTextStream вместо qDebug()? - person lpapp; 29.12.2013
comment
хм, я думаю, что это не проблема qDebug, поскольку я пробовал _textEditor->appendPlainText(QString::fromUtf8(temp.getData())); и работаю над Red Hat Enterprise Linux Workstation версии 6.4 (Сантьяго) - person Mahmoud Hassan; 29.12.2013
comment
@MahmoudHassan: какую версию Qt вы используете? И что он распечатывает: char* getData() const { qDebug() << "TEST0:" << _foo; return const_cast<char *> (_foo.c_str()); } - person lpapp; 29.12.2013
comment
@MahmoudHassan: хорошо, что он распечатал после TEST0:? - person lpapp; 29.12.2013
comment
На самом деле проблема заключалась в том, что строка не была правильно установлена ​​​​перед вызовом функции, большое спасибо за подсказку :) и строка, которая была в терминале, была не из строки cerr из другого класса, а потому, что проект слишком большой и слишком сложный Я запутался. еще раз спасибо за ответ и подсказку. - person Mahmoud Hassan; 29.12.2013
comment
@LightnessRacesinOrbit: как бы вы решили это иначе, если он не может изменить интерфейс или, возможно, вы не читали ветку полностью? - person lpapp; 29.12.2013
comment
@LaszloPapp: По крайней мере, оставьте комментарий или заявление об отказе от ответственности в своем ответе. В противном случае кто-то однажды придет и скопирует/вставит этот код, не понимая, что в нем есть преднамеренная ошибка. - person Lightness Races in Orbit; 29.12.2013
comment
@LaszloPapp: Лучше :P - person Lightness Races in Orbit; 29.12.2013