Qt 5:const char*QString强制转换

use*_*262 5 c++ qstring qt4 qt5 qtcore

在Qt 4中,可以自动将QString转换为"const char*",例如,我可以将QString传递给期望"const char*"的函数.

void myFunction(const char *parameter);

QString myString;
myFunction(myString); //works in QT4
Run Code Online (Sandbox Code Playgroud)

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

当然,我可以改变函数调用

myFunction(myString); 
Run Code Online (Sandbox Code Playgroud)

myFunction(myString.toLatin1().data());
Run Code Online (Sandbox Code Playgroud)

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

lpa*_*app 2

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

#define QString2charp(myString) myString.toLatin1().data()
Run Code Online (Sandbox Code Playgroud)

或者

inline char* QString2charp (const QString &myString)
{
    return myString.toLatin1().data();
}
Run Code Online (Sandbox Code Playgroud)

进而:

myFunction(QString2charp(myString));
Run Code Online (Sandbox Code Playgroud)

当然,在理想的世界中,如果您的“myFunction”能够在等待参数时发生过载,那就太好了QString

void myFunction(const char *parameter);
void myFunction(QString parameter);
Run Code Online (Sandbox Code Playgroud)

然后重载将像这样实现:

void myFunction(const QString &parameter)
{
    myFunction(myString.toLatin1().data());
}
Run Code Online (Sandbox Code Playgroud)

当然,这需要显式构造函数,以便不会发生隐式转换,否则编译器在尝试传递时会抱怨两者存在歧义const char*,但如果您始终使用 QString,则它应该仅适用于 Qt 5。

这在某种程度上等于将原始函数重写为不同的签名QString,因为不幸的是相应的构造函数不是显式的。我想 Qt 5 中并没有为了兼容性而改变这一点,因为它会破坏太多代码。

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