我想将下面的代码片段转换为使用"plain/text" mimetype而不依赖于QTextStream
bool DragDropListModel::dropMimeData(const QMimeData *data,
Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
...
QByteArray encodedData = data->data("application/vnd.text.list");
QDataStream stream(&encodedData, QIODevice::ReadOnly);
QStringList newItems;
while (!stream.atEnd()) {
QString text;
stream >> text;
newItems << text;
}
...
}
我试图应用什么说在Qt解析字符串未定义的大小从二进制数据流
char *ch;
QFile file("file.dat")
file.open(QIODevice::ReadOnly);
QDataStream in(&file)
in >> ch;
QString str(ch);
http://www.qtcentre.org/threads/696-QDataStream-reading-into-QString 和
stream.setByteOrder( QDataStream::BigEndian);
...
quint16 id;
stream >> id; // First two bytes
char* filename;
stream >> filename; // String of undefined size
QString file = QString::fromLatin1(filename);
qDebug() << "output: " << file;
newItems << file;
delete[] filename; //cleanup
,但我总是得到一个空字符串或0。我读到"使用QDataStream(超过QTextStream)的唯一缺点是结果文件是二进制的(即,不是人类可读的)。"是否没有办法将纯文本的q数据流转换为可读的QString?
相似qqstring从QDataStream但我想通过循环从流中读取二进制数据和<<操作符(间接方法)。
文档http://qt-project.org/doc/qt-5/qdatastream.html
详细信息附加
//从应用程序外部拖放纯文本
while (!stream.atEnd()) {
char* a;
stream.readRawData(a, 7); // abcdefg length = 7
QString string(a);
qDebug() << "output " << string; // WORKING => abcdefg
}
假设我在while循环之前写了以下代码:
quint8 v;
stream >> v;
qDebug() << "output: " << v; // => 97 = "a"
相当于
quint8 v;
stream >> v;
QString a;
qDebug() << "output: " << static_cast<char>(v); // => "a"
和while循环崩溃:
error: Exception at 0x5dd02907, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)
我的纯/文本字符串似乎没有长度字节在开始。我可以按原样运行它,但我想知道我是否可以提前确定字符串的长度。每当我试图通过<<
尝试修改代码
char *ch;
QFile file("file.dat")
file.open(QIODevice::ReadOnly);
QDataStream in(&file)
in >> ch;
QString str(ch);
使用char buf[BUF_SIZE]代替char *ch,其中BUF_SIZE为文件的合理大小