c++ - Qt 5 : const char * QString cast

标签 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’转换为‘const char *’”(这是 Visual C++ 2008 编译器,其他编译器会抛出类似的东西)。如果我对文档的理解正确,那是因为 QT5 中不再包含 Qt 3 兼容层。

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

myFunction(myString); 

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

但是,我有一个巨大的代码库,可以很好地使用 Qt 4 进行编译,我真的很想用 Qt 5 编译我的旧代码而不修改它。有什么办法可以实现吗?

最佳答案

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

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

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

然后:

myFunction(QString2charp(myString));

但是

当然,在一个理想的世界中,如果您的“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 中并没有因为兼容性而改变,因为它会破坏太多代码。

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

关于c++ - Qt 5 : const char * QString cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675479/

相关文章:

C++:在小项目的头文件中编写整个类的缺点?

c++ - 如何确定何时位于 QListView 的底部/末尾?

qt - QString 拆分

c++ - 求教在Qt4中使用QGLWidget

c++ - 编译器在通用 lambda 上崩溃

c++ - 为什么在赋值后调用析构函数?

c++ - OpenGL 法线未出现在三角形中

c++ - 如何在 iOS 中添加带有 PCM 数据/缓冲区的可播放(例如 wav、wmv) header ?

permissions - Win7 C++ - kiosk 模式应用程序没有管理员访问权限

c++ - 您将如何使用 C++/Qt5 构建无窗口应用程序?