LINUX.ORG.RU

[Qt] [QTextEdit] Как получить картинку из ресурсов документа?


0

0

Здравствуйте!


Делаю я сейчас несложный 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(...) либо не возвращает данные из ресурсов, либо я неправильно преобразую эти данные. А как правильно преобразовать, я не знаю.

Вопрос - как вытянуть данные картинок из ресурсов документа, чтобы их можно было сохранить?

Ответ на: комментарий от summatus

Ага, спасибо. Не знал о таких подводных камнях, думал что QVariant в любом случае в ByteArray свое содержимое может отдать.

А оказывается, если в QVariant лежит QImage, то QVariant::toByteArray() вернет пустой массив.

Сделал так:

// Из ресурсов вытягивается картинка
QVariant image_data=textarea->document()->resource(QTextDocument::ImageResource, QUrl(image_name));

QImage picture=image_data.value<QImage>();

picture.save(image_file_name, "png");

Работает.

xintrea ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.