Здравствуйте!
Делаю я сейчас несложный WYSIWYG-редактор текста. И возникла необходимость сохранять картинки, которые были вставлены в текст из буфера обмена.
В момент вставки картинки из буфера, ресурсу катринки присваивается уникальное имя, в формате "imageXXXXX", где XXXXX-случайное число (о коллизиях пока не думаем):
// Вставка MIME данных
void EditorTextArea::insertFromMimeData(const QMimeData *source)
{
 QTextCursor cursor = this->textCursor();
 QTextDocument *document = this->document();
 // Вставка картинки
 if(source->hasImage())
  {
   // Принятые данные преобразуются в тип QImage
   QImage image=qvariant_cast<QImage>(source->imageData());
   // Генерируется имя ресурса
   QString image_name="image"+QString::number(qrand());
   // Ресурс добавляется в хранилище ресурсов документа
   document->addResource(QTextDocument::ImageResource, QUrl(image_name), image);
   // Картинка вставляется в текст
   cursor.insertImage(image_name);
   return;
  }
}
В момент сохранения текста, мне нужно вытащить картинки из ресурсов хоть в каком-нибудь виде, чтоб их тоже сохранить в файлы. И этого я сделать не могу.
Я делаю так:
(textarea - это объект класса QTextEdit)
void Editor::save_textarea_images(QString dirname)
{
 qDebug() << "Save images, blocks count " << textarea->document()->blockCount() << "\n";
 // Перебираются блоки документа и находятся блоки с картинками
 QTextBlock bl = textarea->document()->begin();
 while(bl.isValid())
  {
   QTextBlock::iterator it;
   for(it = bl.begin(); !(it.atEnd()); ++it)
    {
     QTextFragment currentFragment = it.fragment();
     if(currentFragment.isValid())
      {
       if(currentFragment.charFormat().isImageFormat())
        {
         // Найден блок с картинкой
         // Выясняется формат картинки
         QTextImageFormat imgFmt = currentFragment.charFormat().toImageFormat();
         // Из формата выясняется имя картинки
         QString image_name=imgFmt.name();
         qDebug() << "Image " << image_name << "\n"; // имя файла
         QString image_file_name=dirname+"/"+image_name;
         qDebug() << "Save image data to file " << image_file_name;
         // Из ресурсов вытягивается картинка
         QVariant image_data=textarea->document()->resource(QTextDocument::ImageResource, image_name);
         qDebug() << "Data length " << image_data.toByteArray().length();
         qDebug() << "Image data as string" << image_data.toString();
         // Картинка записывается в файл
         QFile imgfile(image_file_name);
         QTextStream out(&imgfile);
         out << image_data.toByteArray();
        }
      }
    }
   bl = bl.next();
  }
}
Результат получается вот такой (файлы картинок не создаются, видимо из-за того, что поток нуливой длины):
Save images, blocks count 27
Image  "image476707713"
Save image data to file  "./base/0000000842/image476707713"
Data length  0
Image data as string ""
Image  "image1186278907"
Save image data to file  "./base/0000000842/image1186278907"
Data length  0
Image data  as string ""
То есть, вызов textarea->document()->resource(...) либо не возвращает данные и ресурсов, либо я неправильно преобразую эти данные. А как правильно преобразовать, я не знаю.
Вопрос - как вытянуть данные картинок из ресурсов документа, чтобы их можно было сохранить?