“plain / text”encodedData和QDataStream可读取QString

时间:2014-07-03 14:13:30

标签: c++ qt qdatastream

我想将以下代码段转换为使用“ 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 parse string of undefined size from a binary data stream

中说的内容
 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上)的唯一缺点是生成的文件是二进制的(即,不是人类可读的)。” 有没有办法将纯文本的QDataStream转换为可读的QString?

类似于 QT QString from QDataStream 但我想通过循环和&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;运算符(间接方法)。

文件在 http://qt-project.org/doc/qt-5/qdatastream.html#details


ADD-ON

//从应用程序外部拖放普通文本是“abcdefg”

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循环崩溃:
错误:0x5dd02907异常,代码:0xc0000005:读访问冲突:0x0,flags = 0x0(第一次机会)

我的普通/文本字符串在开头似乎没有长度字节。 我可以按原样运行它,但我想知道我是否可以提前确定字符串的长度。 每当我尝试通过&lt;&lt;&lt;&lt;&lt;操作员,我不能简单地将其重置为开头。

1 个答案:

答案 0 :(得分:0)

尝试修改代码

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文件的大小合理。