[英]Qt 5: const char * QString cast
在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 ¶meter)
{
myFunction(myString.toLatin1().data());
}
当然,这需要构造函数是显式的,这样才不会发生隐式转换,否则编译器会在尝试传递const char*
时抱怨存在歧义,但是如果你总是使用QString,它应该只适用于Qt 5。
这有点等于将原始函数重写为期望QString
的不同签名,因为遗憾的是相应的构造函数不是显式的。 我想在Qt 5中没有改变兼容性,因为它会破坏太多的代码。
正如您所看到的,除了添加单行重载之外,您不需要以这种方式更改代码中的任何内容。 它很整洁,不是吗?
你可以
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> }
不再可能将QString
转换为> = Qt 5中的const char*
,因为QString
是UTF-16
并且不再有用于缓存转换为ASCII的结果的条目。
实现目标的方法是
a)为期望const char*
的函数添加重载,它可以处理QString
,
b)将显式转换代码添加到呼叫站点,或
C)去一些char
为基础的弦一样std::string
。
这些都没有达到你几乎没有变化的目标。
我在QT论坛上找到了这个
const QByteArray byteArray = mytext = textBox.text().toUtf8();
const char *mytext = byteArray.constData();
这解决了我的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.