在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编译而不修改它。有没有办法实现这个目标?
答案 0 :(得分:2)
您可以为您的目的创建一个宏或内联函数来最小化更改,但由于这也需要一个类似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中没有改变兼容性,因为它会破坏太多的代码。
正如您所看到的,除了添加单行重载之外,您不需要以这种方式更改代码中的任何内容。它很整洁,不是吗?
答案 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*
,因为QString
是UTF-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();
这解决了我的问题