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