Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt, Windows] Как прочитать файлы "*.odt"


Автор: dix75 14.8.2009, 10:08
Добрый день!

В Qt есть возможность сохрания текста в файл в формате (OpenDocument Format (ODF) ).

Примерно таким образом:
Код

        QTextDocumentWriter writer(fileName);
        iwriter.write(text_edit_->document());


Но как прочитать все это дело обратно непонятно.

Если использовать совет из Qt Demo

Код

        QFile file(file_name);
        if(!file.open(QFile::ReadOnly)) return false;

        QByteArray data = file.readAll();
        QTextCodec* codec = Qt::codecForHtml(data);
        QString str = codec->toUnicode(data);

        if(Qt::mightBeRichText(str)) text_edit_->setHtml(str);
        else
        {
                str = QString::fromLocal8Bit(data);
                text_edit_->setPlainText(str);
        }


Но, таким образом, прочитать возможно лишь HTML - файлы. 


Автор: SABROG 14.8.2009, 11:07
Цитата(dix75 @  14.8.2009,  10:08 Найти цитируемый пост)
Но как прочитать все это дело обратно непонятно.

Никак. Оно пока только записывать умеет. В Qt вообще нет классов, которые могут сохранить текст с картинками в какой-нибудь популярный формат типа pdf, doc (Word) и потом загружать его обратно для редактирования. Ждем.

Автор: ecspertiza 14.8.2009, 11:53
Цитата(SABROG @  14.8.2009,  11:07 Найти цитируемый пост)
В Qt вообще нет классов, которые могут сохранить текст с картинками в какой-нибудь популярный формат типа pdf


Могу немного несогласиться, в pdf можно записать.

используя QPrinter.

Автор: SABROG 14.8.2009, 12:27
Не выдергивай слова из целого предложения. Прочти еще раз, речь идет не только о сохранении.

Автор: ecspertiza 14.8.2009, 13:18
Да, извиняюсь, не доспалsmile

Автор: dix75 14.8.2009, 15:03
Цитата(SABROG @  14.8.2009,  11:07 Найти цитируемый пост)
Никак. Оно пока только записывать умеет. В Qt вообще нет классов, которые могут сохранить текст с картинками в какой-нибудь популярный формат типа pdf, doc (Word) и потом загружать его обратно для редактирования. Ждем.

Прикольно, конечно.

Да похоже не только это.
лично я не могу записать картинку gif в бд.



Автор: SABROG 14.8.2009, 15:28
Цитата(dix75 @  14.8.2009,  15:03 Найти цитируемый пост)
лично я не могу записать картинку gif в бд.

Выложи минимальный компилируемый пример. Когда я пробовал в последний раз записывать и читать .png в BLOB поле SQLITE БД все работало.

Автор: dix75 14.8.2009, 19:05
SABROG, 
нет png, jpeg, jpg, bmp 
читает и записывает без проблем.
gif только читает smile (думаю если сохранять файл и потом его читать, будет работать, но это как-то коряво ) 

Автор: SABROG 14.8.2009, 22:03
Цитата(dix75 @ 14.8.2009,  19:05)
SABROG, 
нет png, jpeg, jpg, bmp 
читает и записывает без проблем.
gif только читает smile (думаю если сохранять файл и потом его читать, будет работать, но это как-то коряво )

Как сохраняешь в БД, откуда (QPixmap/QImage)? Какими методами?

Автор: dix75 15.8.2009, 11:54
SABROG, 

Как сохраняешь в БД, откуда (QPixmap/QImage)? Какими методами?

из QPixmap


Записываю так (передаю в функцию (запрос, имя файла, список параметров))

Код

//------------------------------------------------------------------------------
void vImageBD::add(const QString& inquiry, const QString& filename, const std::vector<QVariant>& value)
{
        QPixmap px(filename);
        QByteArray batmp;
        QBuffer bftmp(&batmp);
        bftmp.open(QIODevice::WriteOnly);
        px.save(&bftmp, QFileInfo(filename).completeSuffix().toAscii());

        QSqlQuery query(vMain::basebd().database());
        query.prepare(inquiry);
        query.addBindValue(batmp);        
        std::for_each(value.begin(), value.end(), boost::bind(&QSqlQuery::addBindValue,  query, _1, QSql::In));
        query.exec();
}


Вызываю функцию такм образом.

Код

        std::vector<QVariant> vec;
        vec.push_back(vMain::user().userID());
        vec.push_back(image->tag());
        vec.push_back(QDateTime::fromString(image->get_image_date()));
        vec.push_back(image->get_image_description());

        vImageBD::add("INSERT INTO PhotoGallery (Image, UserID, ImagePosition, ImageDate, ImageDescription) VALUES (?, ?, ?, ?, ?);",   image->file_name(), vec);


но gif так запихнуть не удается

Автор: SABROG 15.8.2009, 14:32
Цитата(dix75 @  15.8.2009,  11:54 Найти цитируемый пост)
но gif так запихнуть не удается


Потому, что ты не проверяешь результат команды save(). А вообще вот:

Цитата

BMP    Windows Bitmap    Read/write
GIF    Graphic Interchange Format (optional)    Read
JPG    Joint Photographic Experts Group    Read/write
JPEG    Joint Photographic Experts Group    Read/write
PNG    Portable Network Graphics    Read/write
PBM    Portable Bitmap    Read
PGM    Portable Graymap    Read
PPM    Portable Pixmap    Read/write
XBM    X11 Bitmap    Read/write
XPM    X11 Pixmap    Read/write


save() конвертирует уже распакованную картинку в новый формат. Можно вообще голые пиксели сохранять, вызвав QPixmap::toImage(), а там уже QImage::bits()/QImage::scanLine(n). Можно потом ужать, чтобы место меньше кушало через QByteArray::qCompress(). Можно все сохранять в .png. Но gif может быть анимационным, поэтому лучшего варианта, чем сохранять через QFile я не вижу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)