我正在学习QtCreator并且在文件中写入数据时遇到了麻烦。这是一些代码:
char *str;
int i = 1;
QFile outFile("path/to/file/out.txt");
outFile.open(QIODevice::ReadWrite);
QTextStream out(&outFile);
while (i < rows * 2) {
str = dynamic_cast<QLineEdit *>(this->getItem(i))->text().toLocal8Bit().data();
std::cout << str << std::endl;
out << str << "\n";
i += 2;
}
getItem
会从填充QWidget *
的{{1}}中返回QFormLayout
(这解释了动态广告)。无论如何,当我将QLineEdit
传递给str
它工作正常时,会打印数据,但是当我将std::cout
传递给str
时,它只会写入{{1}的第一个字符。 1}}在文件中
我不知道自己做错了什么,我真的很感激任何提示。
答案 0 :(得分:1)
此行存在问题:str = dynamic_cast<QLineEdit *>(this->getItem(i))->text().toLocal8Bit().data();
dynamic_cast<QLineEdit *>(this->getItem(i))->
可以
->text()
创建了一个临时的QString
.toLocal8Bit()
创建了一个临时的QByteArray
.data()
返回指向QByteArray
一旦传递线,QByteArray将被销毁,你有一个悬空指针。 str
指向无效数据。
之后使用此指针执行的所有操作(除非让它指向其他位置)都是未定义的行为。
尝试使用以下内容:
int i = 1;
QFile outFile("path/to/file/out.txt");
outFile.open(QIODevice::ReadWrite);
QTextStream out(&outFile);
while (i < rows * 2)
{
QLineEdit* lineEdit = dynamic_cast<QLineEdit *>(this->getItem(i));
if (lineEdit)
{
QByteArray str = lineEdit->text().toLocal8Bit();
std::cout << str.data() << std::endl;
out << str.data() << "\n";
i += 2;
}
else
{
std::cerr << "Item at " << i << " is no QLineEdit*" << std::endl;
}
}
out.close();
另外,请检查QFile
是否实际打开以及QTextStream
在撰写时是否报告错误。