【问题标题】:QTextStream(*QFile) constructor is deletedQTextStream(*QFile) 构造函数被删除
【发布时间】:2015-06-25 19:25:55
【问题描述】:

总的来说,我对 C++ 和 Qt 都很陌生,因此我有一个问题:

我有这个代码:

if(!logFile.open(QIODevice::ReadOnly)) {
    QMessageBox::information(0, "error", logFile.errorString());
}
else {
    QTextStream result(&logFile);
    return result.readAll();
}

运行良好。 但是,当我尝试返回 QTextStream 对象而不是带有我从文件中读取的所有文本的 QString 时,会弹出以下错误:

/home/neko/projects/WurmLogparser/wurmlog.cpp:208: error: call to deleted constructor of 'QTextStream'
        return result;
               ^~~~~~

编码导致错误的原因如下:

else {
    QTextStream result(&logFile);
    return result;
    //return result.readAll();
}

当然,在尝试编译第二个版本之前,我会适当地将相关类型更改为 QTextStream。请告诉我第二版代码有什么问题?我以与第一部分相同的方式构造 QTextStream,但它对我产生了奇怪的错误。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    TextStream 对象 [...] 包含所有文本

    流不“包含”任何文本。它是一种从QIODevice 中检索文本的方法,但它本身不包含文本。

    在您的情况下,返回字符串是正确的做法。

    QTextStream 是不可复制的。你不能按价值返回它。在大多数情况下,返回这样的对象是没有意义的。如果您在流上进行操作,则应将其作为参考参数传递:

    void myFunction(QTextStream & stream) { ... }
    

    如果您希望返回从文件中读取的内容,可以将它们作为字符串(如您所做的那样)或作为原始二进制数据返回:

    QByteArray myFunction() {
      ...
      return logFile.readAll();
    }
    

    然后您可以在字节数组上使用流:

    void foo() {
      auto data = myFunction();
      auto stream = QTextStream(&data);
      // use the stream
      ...
    }
    

    【讨论】:

      【解决方案2】:

      为了进一步澄清,QTextStream 的复制构造函数(以及 = 运算符)都是私有的,这就是你不能复制它们的原因:o

      Kuba 很好地解释了解决方法(+1 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 2022-01-22
        • 2014-01-15
        • 2015-08-15
        • 1970-01-01
        • 2013-08-19
        相关资源
        最近更新 更多