【问题标题】:Convert const char* to QString将 const char* 转换为 QString
【发布时间】:2014-01-16 11:13:11
【问题描述】:

我必须使用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()); 应该可以工作。
  • QString 接受const char *。无需特意假装它不是恒定数据。
  • @LaszloPapp 奇怪的是,所有这些版本都有相同的“空”字符串。我认为我调用的函数中的const_cast&lt;char *&gt; 存在问题。但我无权编辑该函数以返回 std:string 或正常 char *
  • 在这种情况下,我将函数输出(getData() 的结果)保存到一个变量中,并使用调试器检查该函数是否真的返回了一个有效的字符串。然后继续转换为 QString。它必须转换,因为 QString 有一个合适的构造函数 (qt-project.org/doc/qt-4.8/qstring.html#QString-8)。正如克里斯所说,尝试不进行强制转换,只需使用const char*
  • 我开始认为 _foo 在周围的代码中没有正确设置。否则我无法解释。 :-)

标签: c++ qt qstring qtcore const-cast


【解决方案1】:

下面的代码应该可以正常工作。您的问题很可能在其他地方。请做一个干净的构建。

错误将出现在您未与我们共享的更复杂代码中的其他位置。您可能会遇到设置 _foo 不正确的问题。

正如您自己指出的那样,您无法更改界面,但最好注意在理想世界中,您不会将 std 字符串与 QStrings 混合。您只需在代码中完全使用 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!
"

【讨论】:

  • getData()中尝试以与问题中相同的方式返回:return const_cast&lt;char *&gt; (_foo.c_str());
  • @MahmoudHassan:我做到了,效果很好;看看答案。
  • @MahmoudHassan:我什至用qmake -r &amp;&amp; make &amp;&amp; ./main 运行了 qt 4 和 5。
  • @MahmoudHassan:您使用的是哪种编译器类型和版本?
  • 我知道它应该可以工作我实际上可以写类似cerr &lt;&lt; temp.getData(); 并在终端中打印字符串,但qDebug() &lt;&lt; QString::fromUtf8(temp.getData()); 打印只是空行。我使用 QT 4.8 并使用 gmake 构建。
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多