一般来说,我对C++和Qt都是新手,因此我有一个问题:

我有以下代码:

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

运行正常。
但是,当我尝试返回QTextStream对象而不是QString w /从文件中读取的所有文本时,会弹出以下错误:
/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,但是它对我产生了奇怪的错误。

最佳答案



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

在您的情况下,返回字符串是正确的事情。
QTextStream是不可复制的。您不能按值返回它。在大多数情况下,返回这样的对象没有任何意义。如果在流上操作,则应将其作为引用参数传递:

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

如果您希望返回从文件读取的内容,则可以将它们作为字符串(如您所做的那样)或作为原始二进制数据返回:
QByteArray myFunction() {
  ...
  return logFile.readAll();
}

然后,您可以在字节数组上使用流:
void foo() {
  auto data = myFunction();
  auto stream = QTextStream(&data);
  // use the stream
  ...
}

10-08 05:13