一般来说,我对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
...
}