Qt 5:const char * QString强制转换

时间:2014-05-15 10:21:33

标签: c++ qt4 qt5 qstring qtcore

在Qt 4中,可以自动将QString转换为" const char *"我可以将QString传递给期望" const char *"。

的函数
void myFunction(const char *parameter);

QString myString;
myFunction(myString); //works in QT4

在Qt 5中,我会得到一个"错误C2440:' type cast' :无法转换为' QString' to' const char *'" (这是Visual C ++ 2008编译器,其他编译器会抛出类似的东西)。如果我正确理解文档,那是因为在QT5中不再包含Qt 3兼容层。

当然,我可以从

更改函数调用
myFunction(myString); 

myFunction(myString.toLatin1().data());

但是,我有一个庞大的代码库,用Qt 4编译得很好,我真的想让我的旧代码用Qt 5编译而不修改它。有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:2)

您可以为您的目的创建一个宏或内联函数来最小化更改,但由于这也需要一个类似grep的操作,因此没有太大区别。

#define QString2charp(myString) myString.toLatin1().data()

inline char* QString2charp (const QString &myString)
{
    return myString.toLatin1().data();
}

然后:

myFunction(QString2charp(myString));

BUT

当然,在一个理想的世界里,如果你的" myFunction"可能会出现超载,期待QString参数。

void myFunction(const char *parameter);
void myFunction(QString parameter);

然后重载将实现如下:

void myFunction(const QString &parameter)
{
    myFunction(myString.toLatin1().data());
}

当然,这需要构造函数是显式的,这样就不会发生隐式转换,否则编译器会在尝试传递const char*时抱怨存在歧义,但是如果你总是使用QString,那么应该只使用Qt 5。

这有点等于将原始函数重写为期望QString的不同签名,但遗憾的是相应的构造函数不是显式的。我想在Qt 5中没有改变兼容性,因为它会破坏太多的代码。

正如您所看到的,除了添加单行重载之外,您不需要以这种方式更改代码中的任何内容。它很整洁,不是吗?

答案 1 :(得分:0)

你可以

  • 将您的功能签名更改为MyFunction( const QString & parameter )(当然,只有在您不再需要char *时才会有效)
  • 重载MyFunction

    void myFunction(const char *parameter); //this is your normal function
    void myFunction( const QString & parameter )
    {
        char * c_str = nullptr;
        <convert parameter to char * in any way that suits you>
        myFunction( c_str );
    }
    
  • 如果出于某种原因上述情况不可能,那么最好的方法可能就是写一个类似的包装器:

    void MyFunctionWrapper( const QString & parameter )
    {
        <same as above>
    }
    

答案 2 :(得分:0)

不再可能在&gt; = Qt 5中将QString投射到const char*,因为QStringUTF-16并且不再有用于缓存结果的条目转换为ASCII。

实现目标的方法是 a)为期望const char*的函数添加重载,这些函数可以处理QString s,
b)将显式转换代码添加到呼叫站点,或者 c)转到一些基于char的字符串,如std::string

这些都没有实现你几乎没有变化的目标。

答案 3 :(得分:0)

我在QT论坛上发现了这个

const QByteArray byteArray = mytext = textBox.text().toUtf8();
const char *mytext = byteArray.constData();

这解决了我的问题