【问题标题】:Qt 5: const char * QString castQt 5: const char * QString 强制转换
【发布时间】:2014-05-15 10:21:33
【问题描述】:

在 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' : cannot convert from 'QString' to 'const char *'”(这是 Visual C++ 2008 编译器,其他编译器会抛出类似的东西)。如果我正确理解文档,那是因为 Qt 3 兼容层不再包含在 QT5 中。

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

myFunction(myString); 

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

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

【问题讨论】:

    标签: c++ qt4 qt5 qstring qtcore


    【解决方案1】:

    您可以为您的目的创建一个宏或内联函数以最小化更改,但由于这也需要类似 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 中并没有为了兼容性而改变,因为它会破坏太多代码。

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

    【讨论】:

      【解决方案2】:

      你也可以

      • 将函数的签名更改为 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>
        }
        

      【讨论】:

        【解决方案3】:

        在 >= Qt 5 中不再可能将 QString 转换为 const char*,因为 QStringUTF-16 并且不再有缓存转换为 ASCII 的结果的条目。

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

        这些都不能满足你几乎没有变化的目标。

        【讨论】:

          【解决方案4】:

          我在 QT 论坛上找到了这个

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

          这解决了我的问题

          【讨论】:

            猜你喜欢
            • 2020-11-13
            • 2014-01-16
            • 1970-01-01
            • 1970-01-01
            • 2013-09-27
            • 2014-08-17
            • 1970-01-01
            • 2021-11-16
            • 1970-01-01
            相关资源
            最近更新 更多