将 const char* 转换为 QString。

21

我必须使用类型为const char*的函数输出结果,并将其转换为QString

注意:在该函数内部,以下代码行可返回const char*

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

其中_foostd::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());

展示更多代码。这不足以提供帮助。QString foo5 = QString::fromUtf8(temp.getData()); 应该可以工作。 - László Papp
1
QString 接受 const char *。不需要刻意假装它不是常量数据。 - chris
@LaszloPapp 奇怪的是,所有这些版本都得到了相同的“空”字符串。我认为问题在于我调用的函数中的 const_cast<char *>。但是我没有权限编辑该函数以返回 std:string 或普通的 char * - Mahmoud Hassan
在这种情况下,我将函数输出(getData()的结果)保存到一个变量中,并使用调试器检查该函数是否确实返回有效的字符串。然后再进行转换为QString。必须转换,因为QString具有适当的构造函数(http://qt-project.org/doc/qt-4.8/qstring.html#QString-8)。正如Chris所说,尝试不使用强制转换,只使用`const char *`。 - Sceptical Jule
我开始认为代码中的_foo没有正确设置。否则我无法解释这个问题。 :-) - László Papp
显示剩余3条评论
1个回答

10

以下代码应该可以正常工作。你遇到的问题很可能在其他地方。请进行一次清洁构建。

错误很可能出现在你没有与我们共享的更复杂的代码中的其他地方。你可能会遇到在设置 _foo 时不正确的问题。

正如你自己所指出的,你不能改变接口,但最好注意,在理想的情况下,你不应该混合使用std字符串和QString。你应该在你的代码中全部使用 QStrings。

即使你需要出于某种原因使用std或raw char*类型,也最好不要在代码中进行这样的const转换,因为QString将处理传递给它的const字符串。

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!
"

@MahmoudHassan:我甚至在qt 4和5中运行了它,使用命令“qmake -r && make && ./main”。 - László Papp
我知道它应该可以工作,实际上我可以编写类似于 cerr << temp.getData(); 的代码并在终端中打印字符串,但是 qDebug() << QString::fromUtf8(temp.getData()); 只会打印空行。我使用 QT 4.8 并使用 gmake 进行构建。 - Mahmoud Hassan
@MahmoudHassan:gmake?你用的是哪个操作系统?你能回答一下我的编译器问题吗?所以,你的问题可能不是转换,而是qDebug()?你尝试过使用QTextStream代替qDebug()了吗? - László Papp
嗯,我认为这不是qDebug的问题,因为我尝试了_textEditor->appendPlainText(QString::fromUtf8(temp.getData()));,而且我正在使用“Red Hat Enterprise Linux Workstation release 6.4 (Santiago)”。 - Mahmoud Hassan
@MahmoudHassan:好的,在“TEST0:”之后它打印出了什么? - László Papp
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接